AudioToolbox - задержка обратного вызова во время записи - PullRequest
4 голосов
/ 14 июля 2011

В последнее время я работаю над очень специфическим проектом для iOS, и мои исследования привели меня к почти окончательному коду.Я решил все крайние трудности, с которыми сталкивался до сих пор, но в этом у меня нет ни малейшего понятия (ни о причине, ни о возможности ее решения).

Я настроил свойаудио очередь (частота дискретизации 44100, формат LinearPCM, 16 бит на канал, 2 байта на кадр, 1 канал на кадр ...) и начать запись звука с 12 аудио буферами.Однако после каждых 4 обратных вызовов, похоже, возникает задержка.

Ситуация следующая: первые 4 обратных вызова вызываются с интервалом, равным примерно 2 мс.Однако между 4-м и 5-м задержка составляет около 60 мс.То же самое происходит между 8-м и 9-м, 12-м и 13-м и далее ...

Кажется, существует связь между байтами на кадр и моментом задержки.Я знаю это, потому что если я изменяю до 4 байтов на кадр, у меня начинается задержка между 8-м и 9-м, затем между 16-м и 17-м, 24-м и 25-м ... Тем не менее, похоже, что нетлюбая связь между моментом задержки и количеством буферов.

Функция обратного вызова выполняет только две вещи: сохраняет аудиоданные (inBuffer-> mAudioData) в массиве, который может использовать мой класс;и вызовите другой AudioQueueEnqueueBuffer, чтобы поместить текущий буфер обратно в очередь.

Кто-нибудь уже проходил эту проблему?Кто-нибудь знает, по крайней мере, что может быть причиной этого?

Заранее спасибо.

1 Ответ

3 голосов
/ 14 июля 2011

Кажется, что API Audio Queue работает поверх API AudioIO Unit RemoteIO, реальный размер аудио буфера, вероятно, не связан, и в вашем примере больше, чем любой размер буферов Audio Queue.Поэтому, когда буфер RemoteIO готов, куча ваших небольших буферов AQ быстро заполняется.И тогда вы получите более длительную задержку в ожидании заполнения большего буфера сэмплами.

Если вы хотите более контролируемую (более равномерно распределенную) задержку буфера, попробуйте использовать Audio Unit RemoteIo напрямую.

...