0

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

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

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

是否可以在不等待回调的情况下立即渲染音频?使用 AudioQueue 可以通过调用AudioQueueEnqueueBuffer(),我不知道如何使用 AudioUnit。我希望你能帮助我。

4

1 回答 1

1

如果不等待回调(可能被 API 隐藏),就无法“立即”播放音频,甚至忽略硬件 DMA 中断时序、数据缓冲和 DAC 延迟等问题。

DAC(数模转换器)以固定采样率输出音频样本。当音频样本需要通过 DAC 发送时,您已经准备好数据,或者一些垃圾(点击、间隙等)被转换为模拟音频。

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

于 2018-05-15T21:20:51.557 回答