我使用AudioUnit录制和播放8 KHz采样率和8位音频采样的音频。我使用以下来源的示例:https://github.com/fuxx/MicInput
播放部分基于回调模式。使用此方法,我无法控制何时播放音频,Core Audio 在需要播放更多音频数据时会调用回调。
问题是,我从网络获取音频数据,因此不能保证为下一次回调准备好音频数据。有时,回调会错过来自网络的音频数据,因此有大约 20 毫秒的间隔,听起来像是点击。
是否可以在不等待回调的情况下立即渲染音频? 使用AudioQueue可以通过调用AudioQueueEnqueueBuffer((来实现,我不知道如何使用AudioUnit。我希望你能帮助我。
如果不等待回调(可能被 API 隐藏(,也无法"立即"播放音频,甚至忽略硬件 DMA 中断时序、数据缓冲和 DAC 延迟等问题。
DAC(数模转换器(以固定采样率输出音频样本。 当需要通过 DAC 发送音频样本时,您已经准备好数据,或者一些垃圾(咔嗒声、间隙等(被转换为模拟音频。
音频单元基于拉取模型(可能是由于底层硬件 DMA 系统和操作系统设备驱动程序的需求(。 音频队列(和其他 API,如 AVAudioPlayer(构建在音频单元之上。 因此,当您将缓冲区排队到音频队列时,它不会立即真正播放。 相反,该队列缓冲区仍在"后台"等待音频单元回调。