【问题标题】:How to playback audio without using Callback with AudioUnit如何在不使用 AudioUnit 的回调的情况下播放音频
【发布时间】:2018-10-25 12:41:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios iphone audiounit audioqueue remoteio


    【解决方案1】:

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

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

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

    【讨论】:

    • 我的意思不是立即喜欢直接写入 DAC 模块,而是更喜欢附加到内部缓冲区,如果缓冲区之前为空,则立即呈现。 +1 有用的答案,但我希望有一个解决方案来解决丢失的数据包,如果回调很快就会被调用。
    • @AndaluZ :错误隐藏,或者如何处理丢失的音频数据包,值得它自己单独的新问题。这是一个比 iOS 音频单元更大的话题。
    • 附加到下一个可用的内部缓冲区是音频单元回调正在做的事情。之前的缓冲区已经被运送到其他硬件单元。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 2021-04-16
    • 2016-11-23
    • 1970-01-01
    相关资源
    最近更新 更多