Воспроизведение MP3 с помощью RemoteIO и AudioUnits на iPhone ... возможно? - PullRequest
2 голосов
/ 07 декабря 2009

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

Это вообще возможно? Если да, можете ли вы предоставить небольшую информацию о коде?

Спасибо за миллион.

Ответы [ 2 ]

2 голосов
/ 31 декабря 2009

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

err = AudioDeviceAddIOProc(deviceID, ioProc, self);

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

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

1 голос
/ 20 апреля 2012

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

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

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

...