Как воспроизвести аудио без использования Callback с AudioUnit - PullRequest
0 голосов
/ 15 мая 2018

Я использую AudioUnit для записи и воспроизведения звука с частотой дискретизации 8 кГц и 8 бит.Я использую пример из следующего источника: https://github.com/fuxx/MicInput

Часть воспроизведения основана на шаблоне обратного вызова.С помощью этого метода я не могу контролировать, когда воспроизводить аудио, Core Audio вызывает обратный вызов, когда ему требуется больше аудиоданных для воспроизведения.

Дело в том, что я получаю аудиоданные из сети итаким образом, нельзя обещать, что аудиоданные готовы для следующего обратного вызова.Иногда при обратном вызове пропускаются аудиоданные из сети, поэтому разрыв составляет около 20 мс, что походит на щелчок.

Возможно ли визуализировать звук немедленно, не ожидая обратного вызова ?С AudioQueue это возможно, вызывая AudioQueueEnqueueBuffer () , я не знаю, как это сделать с AudioUnit.Я надеюсь, что вы можете мне помочь.

1 Ответ

0 голосов
/ 16 мая 2018

Невозможно воспроизвести звук «немедленно», не ожидая обратного вызова (возможно, скрытого API), даже игнорируя такие проблемы, как аппаратная синхронизация прерываний DMA, буферизация данных и задержка ЦАП.

ЦАП (цифро-аналоговый преобразователь) выводит аудиосэмплы с фиксированной частотой дискретизации. Либо у вас есть готовые данные, когда аудиосэмплы необходимо отправить через ЦАП, либо какой-то мусор (щелчки, пробелы и т. Д.) Преобразуется в аналоговое аудио.

Аудиоустройства основаны на модели извлечения (вероятно, из-за потребностей базовой аппаратной системы DMA и драйвера устройства ОС). Аудио-очереди (и другие API, такие как AVAudioPlayer) построены поверх аудиоустройств. Поэтому, когда вы помещаете буфер в аудио-очередь, он не воспроизводится сразу. Вместо этого этот буфер очереди все еще ожидает обратного вызова аудиоустройства "под капотом".

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