Потоковое воспроизведение MP3 на iOS - PullRequest
7 голосов
/ 19 июля 2010

Я хочу использовать 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;
}

1 Ответ

1 голос
/ 19 июля 2010

Поскольку вы читаете байты данных 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. Если вы сделаете это, возможно, стоит разархивировать все один раз и сохранить его в памяти, чтобы минимизировать накладные расходы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...