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

Ios 如何在不使用AudioUnit回调的情况下播放音频,ios,iphone,audiounit,audioqueue,remoteio,Ios,Iphone,Audiounit,Audioqueue,Remoteio,我使用AudioUnit录制和播放8 KHz采样和8位音频采样的音频。我使用以下来源的示例: 回放部分基于回调模式。使用这种方法,我无法控制何时播放音频,核心音频在需要播放更多音频数据时调用回调 问题是,我从网络上获取音频数据,因此不能保证为下次回调准备好音频数据。有时,回调会错过来自网络的音频数据,因此会有大约20毫秒的间隔,听起来像是单击 是否可以在不等待回调的情况下立即呈现音频? 有了AudioQueue,可以调用AudioQueuenQueueBuffer(),我不知道如何使用Audio

我使用AudioUnit录制和播放8 KHz采样和8位音频采样的音频。我使用以下来源的示例:

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

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

是否可以在不等待回调的情况下立即呈现音频?
有了AudioQueue,可以调用AudioQueuenQueueBuffer(),我不知道如何使用AudioUnit来实现这一点。我希望您能帮助我。

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

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


音频单元基于拉模式(可能是由于底层硬件DMA系统和操作系统设备驱动程序的需要)。音频队列(以及其他API,如AVAudioPlayer)构建在音频单元之上。所以,当您将缓冲区排入音频队列时,它不会立即播放。相反,队列缓冲区仍然在“引擎盖下”等待音频单元回调。

我的意思不是立即像直接写入DAC模块一样,而是像附加到内部缓冲区一样,如果之前缓冲区为空,则会立即渲染+对于有用的答案,我希望能找到一个解决方案来解决丢失的数据包,如果回调很快被调用的话。@AndaluZ:错误隐藏,或者如何处理丢失的音频数据包,应该有一个单独的新问题。这是一个比iOS音频单元更大的话题。添加到下一个可用的内部缓冲区是音频单元回调的作用。以前的缓冲区已经发送到其他硬件单元。