Потоковая передача MP3 на iOS

Я хочу использовать 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;
}
7
задан Marvin Killing 20 July 2010 в 18:03
поделиться

1 ответ

Потому что вы читаете байты данных MP3 и обрабатываете их как данные PCM.

Вы почти наверняка захотите AudioFileReadPacketData () . РЕДАКТИРОВАТЬ: За исключением того, что все еще дает вам данные MP3; он просто выдает его в пакетах и ​​(возможно) анализирует заголовки пакетов.

Если вам не требуется OpenAL, возможно, лучше использовать AVAudioPlayer (согласно Руководству по программированию мультимедиа , есть также службы Audio Queue, если вам нужен больший контроль).

Если вам действительно нужно использовать OpenAL, согласно TN2199 , вам необходимо преобразовать его в PCM в собственном порядке байтов. См. oalTouch / Classes / MyOpenALSupport.c для примера использования расширенных служб аудиофайлов для этого. Обратите внимание, что TN2199 говорит, что формат «должен ... не использовать аппаратную декомпрессию» - согласно Руководству по программированию мультимедиа, программное декодирование поддерживается для всего, кроме HE-AAC, начиная с OS 3.0. Также обратите внимание, что программное декодирование MP3 может использовать значительное количество процессорного времени.

В качестве альтернативы можно явно преобразовать аудио с помощью AudioConverter или (возможно) AudioUnit с kAudioUnitSubType_AUConverter. Если вы это сделаете, возможно, стоит распаковать все один раз и сохранить в памяти, чтобы минимизировать накладные расходы.

1
ответ дан 7 December 2019 в 20:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: