Потоковое воспроизведение MP3 на iOS

Я хочу использовать OpenAL для воспроизведения музыки в игре для iOS. Музыкальные файлы хранятся в формате mp3, и я хочу транслировать их, используя буферную очередь. Я загружаю аудиоданные в буферы с помощью AudioFileReadPacketData (). Однако воспроизведение буферов вызывает у меня только шум. Он отлично работает с файлами caf, но не с mp3. Я пропустил какой-то важный шаг в расшифровке файла?

Код, который я использую для открытия звукового файла:

- (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;
}

person Marvin Killing    schedule 19.07.2010    source источник


Ответы (1)


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

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

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

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

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

person tc.    schedule 19.07.2010
comment
Спасибо за ваш ответ. Я заменил AudioFileReadBytes () на AudioFileReadPacketData (). Я обновил вопрос своим новым кодом. Проблема не устранена, все, что я получаю, - это шум. - person Marvin Killing; 20.07.2010
comment
Что вы решили сделать из интереса? - person tc.; 22.07.2010
comment
Я использую AVAudioPlayer, он мне подходит. До сих пор не знаю, как я мог это пропустить. Еще раз спасибо за отличный ответ. - person Marvin Killing; 23.07.2010