如何在不使用AudioUnit回调的情况下播放音频

时间:2018-05-15 15:42:20

标签: ios iphone audiounit audioqueue remoteio

我使用AudioUnit以8 KHz采样率和8位音频采样录制和播放音频。我使用以下来源的示例:https://github.com/fuxx/MicInput

播放部分基于回调模式。使用这种方法,我无法控制何时播放音频,Core Audio在需要播放更多音频数据时调用回调。

问题是,我从网络获取音频数据,因此无法承诺为下一次回调准备好音频数据。有时候,回调会错过来自网络的音频数据,因此会有大约20毫秒的间隙,这听起来像是一次点击。

是否可以立即呈现音频而无需等待回电? 使用AudioQueue可以通过调用 AudioQueueEnqueueBuffer()来实现,我不知道如何使用AudioUnit。我希望你能帮助我。

1 个答案:

答案 0 :(得分:1)

没有办法立即播放音频"无需等待回调(可能由API隐藏),甚至忽略硬件DMA中断时序,数据缓冲和DAC延迟等问题。

DAC(数模转换器)以固定的采样率输出音频样本。要么在需要通过DAC发送音频样本时准备好数据,要么将一些垃圾(点击,间隙等)转换为模拟音频。

音频单元基于拉模型(可能由于底层硬件DMA系统和OS设备驱动程序的需要)。音频队列(以及其他API,例如AVAudioPlayer)构建在音频单元之上。因此,当您将缓冲区排入音频队列时,它并不会立即发挥作用。相反,该队列缓冲区仍在等待音频单元回调"#34;