Воспроизведение больших файлов Core Audio (сжатых) и использование памяти

Итак, я настроил многоканальный микшер и модуль удаленного ввода / вывода для смешивания / воспроизведения нескольких буферов данных PCM, которые я читаю из аудиофайлов. Для коротких звуковых эффектов в моей игре я загружаю весь файл в буфер памяти, используя ExtAudioFileRead(),

Для моей фоновой музыки, скажем, у меня есть сжатый аудиофайл за 3 минуты. Предполагается, что он закодирован как mp3 @ 128 кбит / с (44,100 Гц стерео), что дает около 1 МБ в минуту или всего 3 МБ. Несжатый, в памяти, я думаю, что это примерно в десять раз, если я правильно помню. Я мог бы использовать тот же метод, что и для небольших файлов; я верю ExtAudioFileRead() заботится о декодировании, используя (один) аппаратный декодер, когда он доступен, но я бы предпочел не читать весь буфер сразу, а вместо этого "регулярно" передавать его с диска через равные промежутки времени.

Первое, что приходит на ум, - это перейти на шаг ниже к (не "расширенному") API-интерфейсу Audio File Services и использовать его. AudioFileReadPackets(), вот так:

  1. Подготовьте два буфера A и B, каждый из которых достаточно большой, чтобы вместить, скажем, 5 секунд звука. Во время воспроизведения начните чтение из одного буфера и переключитесь на другой при достижении конца (т. Е. Они составляют две половины кольцевого буфера).

  2. Считайте первые 5 секунд аудио из файла в буфер A.

  3. Прочитайте следующие 5 секунд аудио из файла в буфер B.

  4. Начните воспроизведение (из буфера A).

  5. Как только воспроизводящая головка войдет в буфер B, загрузите следующие 5 секунд аудио в буфер A.

  6. Как только воспроизводящая головка снова войдет в буфер A, загрузите следующие 5 секунд аудио в буфер B.

  7. Перейти к #5

Это правильный подход или есть лучший способ?

1 ответ

Решение

Я бы предложил использовать класс AVAudioPlayer высокого уровня для простого фонового воспроизведения аудиофайла. См.: https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioPlayerClassReference/Chapters/Reference.html

Если вам требуется более детальное управление и меньшая задержка, проверьте Apple AUAudioFilePlayer. См. AudioUnitProperties.h для обсуждения. Это аудиоустройство, которое абстрагирует сложности потоковой передачи аудиофайла с диска. Тем не менее, его все еще довольно сложно настроить и использовать, поэтому обязательно попробуйте AVAudioPlayer.

Другие вопросы по тегам