Воспроизведение MP3 с помощью RemoteIO и AudioUnits на iPhone… возможно?

StackOverflow https://stackoverflow.com/questions/1857637

  •  13-09-2019
  •  | 
  •  

Вопрос

Я хочу воспроизвести mp3, а не несжатый файл, используя RemoteIO/AudioUnit.Использование несжатых файлов, очевидно, требует слишком много места на диске (30 МБ против 3 МБ для mp3).

Возможно ли это вообще?Если да, можете ли вы дать небольшой код?

Бесконечно благодарен.

Это было полезно?

Решение

Да, это возможно.Но для этого требуется многократное использование аудио API и несколько потоков.

Из-за ограничений в реальном времени потока обратного вызова буфера Audio Unit вам придется выполнять преобразование сжатых файлов в необработанные сэмплы PCM вне обратного вызова Audio Unit.Вы можете использовать Extended Audio File Services или AVAssetReader для преобразования в несжатые сэмплы вне обратного вызова Audio Unit.Однако вам не нужно распаковывать весь файл сразу.Короткий несжатый буфер длительностью в доли секунды, скорее всего, подойдет, если вы продолжаете заполнять его достаточно далеко до скорости потребления буфера обратного вызова Audio Unit.Это можно сделать в отдельном потоке, управляемом таймером, который отслеживает потребление буфера и соответствующим образом распаковывает ровно столько звука, возможно, в кольцевой буфер или кольцевой FIFO.

То, что вы получите, будет похоже на перезапись слоя Audio Queue API, но с большей настраиваемостью.

Другие советы

Насколько низкого уровня вы хотите достичь?Вы можете использовать API AudioHardware:

err = AudioDeviceAddIOProc(deviceID, ioProc, self);

и в вашем ioProc самостоятельно заполняйте буферы, слушайте изменения оборудования и занимайтесь потоковой передачей в реальном времени и многими другими низкоуровневыми вещами.

Я предполагаю, что вы уже декодируете данные mp3 с помощью AudioConverter и знаете, как это сделать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top