Воспроизведение MP3 с помощью RemoteIO и AudioUnits на iPhone… возможно?
-
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 и знаете, как это сделать.