Я хочу использовать OpenAL, чтобы играть музыку в игре iOS. Музыкальные файлы хранятся в mp3 формате, и я хочу передать их потоком использующий буферную очередь. Я загружаю аудиоданные в буферное использование AudioFileReadPacketData (). Однако проигрывание буферов только дает мне шум. Это работает отлично на caf файлы, но не на mp3s. Я пропускал некоторый жизненный шаг в декодировании файла?
Код я использую для открытия звукового файла:
- (void) openFile:(NSString*)fileName {
NSBundle *bundle = [NSBundle mainBundle];
CFURLRef url = (CFURLRef)[[NSURL fileURLWithPath:[bundle pathForResource:fileName ofType:@"mp3"]] retain];
AudioFileOpenURL(url, kAudioFileReadPermission, 0, &audioFile);
AudioStreamBasicDescription theFormat;
UInt32 formatSize = sizeof(theFormat);
AudioFileGetProperty(audioFile, kAudioFilePropertyDataFormat, &formatSize, &theFormat);
freq = (ALsizei)theFormat.mSampleRate;
CFRelease(url);
}
Код я использую для заполнения буферов:
- (void) loadOneChunkIntoBuffer:(ALuint)buffer {
char data[STREAM_BUFFER_SIZE];
UInt32 loadSize = STREAM_BUFFER_SIZE;
AudioStreamPacketDescription packetDesc[STREAM_PACKETS];
UInt32 numPackets = STREAM_PACKETS;
AudioFileReadPacketData(audioFile, NO, &loadSize, packetDesc, packetsLoaded, &numPackets, data);
alBufferData(buffer, AL_FORMAT_STEREO16, data, loadSize, freq);
packetsLoaded += numPackets;
}
Потому что вы читаете байты данных MP3 и обрабатываете их как данные PCM.
Вы почти наверняка захотите РЕДАКТИРОВАТЬ: За исключением того, что все еще дает вам данные MP3; он просто выдает его в пакетах и (возможно) анализирует заголовки пакетов. AudioFileReadPacketData ()
.
Если вам не требуется OpenAL, возможно, лучше использовать AVAudioPlayer (согласно Руководству по программированию мультимедиа , есть также службы Audio Queue, если вам нужен больший контроль).
Если вам действительно нужно использовать OpenAL, согласно TN2199 , вам необходимо преобразовать его в PCM в собственном порядке байтов. См. oalTouch / Classes / MyOpenALSupport.c для примера использования расширенных служб аудиофайлов для этого. Обратите внимание, что TN2199 говорит, что формат «должен ... не использовать аппаратную декомпрессию» - согласно Руководству по программированию мультимедиа, программное декодирование поддерживается для всего, кроме HE-AAC, начиная с OS 3.0. Также обратите внимание, что программное декодирование MP3 может использовать значительное количество процессорного времени.
В качестве альтернативы можно явно преобразовать аудио с помощью AudioConverter или (возможно) AudioUnit с kAudioUnitSubType_AUConverter. Если вы это сделаете, возможно, стоит распаковать все один раз и сохранить в памяти, чтобы минимизировать накладные расходы.