循环缓冲区的填充速度快于 AVAudioSourceNode 渲染块可以从中读取数据

Posted

技术标签:

【中文标题】循环缓冲区的填充速度快于 AVAudioSourceNode 渲染块可以从中读取数据【英文标题】:Circular buffer filling up faster than AVAudioSourceNode render block can read data from it 【发布时间】:2020-08-25 20:43:07 【问题描述】:

我正在试验 AVAudiosourceNode,已将其连接到混音器节点以输出到扬声器。我是 iOS 和音频编程的新手,所以如果这个问题是无知或不清楚的,我深表歉意,但我会尽力解释。

在 AVAudioSourceNode 渲染块中,我试图检索已接收到的已存储在循环缓冲区中的流数据(例如,我目前使用 FIFO 缓冲区的基本实现,但正在考虑转移到 TPCircularBuffer)。我检查缓冲区是否有足够的字节来填充音频缓冲区,如果有,我会抓取这些字节进行输出;如果没有,我要么等待,要么尽我所能,用零填充缺失的字节。

在调试中,我似乎遇到了这样一种情况,即循环缓冲区的填充速度比渲染块调用访问缓冲区以从中检索数据的速度快很多。可以理解的是,在运行 OK 片刻之后,一旦循环缓冲区已满(我什至不确定我应该实际做到多大,但我想这是另一个问题),输出就会变成垃圾。

就好像用流数据(可能还有其他任务)填充循环缓冲区的行为优先于在渲染块中进行的调用。我认为涉及音频节点的音频操作会自动优先处理,但可能是我没有完成实现此操作所需的操作。

我已经阅读了这些主题:

iOS - Streaming and receiving audio from a device to another ends in one only sending and the other only receiving

Synchronising with Core Audio Thread

这似乎在实质上引发了类似的问题,但对我的理解水平和情况提供更多最新的指导和解释将是有帮助的,非常感谢!

【问题讨论】:

【参考方案1】:

在播放时,音频系统只会以指定的采样率请求数据。如果长时间以高于该采样率的速度填充循环缓冲区,则会溢出。

因此,您必须确保您的采样生成器或传入数据流符合音频系统配置的采样率,不多也不少(严格限制突发或延迟抖动除外)。循环缓冲区的大小需要足够大,以覆盖最大突发大小加上最大延迟抖动加上任何预填充加上安全余量。

另一个可能的错误是试图在渲染块回调中做很多事情。因此,Apple 建议不要在实时音频回调中使用任何需要内存管理或锁或信号量的代码。

【讨论】:

以上是关于循环缓冲区的填充速度快于 AVAudioSourceNode 渲染块可以从中读取数据的主要内容,如果未能解决你的问题,请参考以下文章

Java 音频字节缓冲区需要不同的时间来填充

C - 填充 TCP 套接字发送缓冲区

使用后台并行无限循环 C# 读取缓冲区 [关闭]

录制的声音比原始声音慢

OpenCV:如何为每个像素填充具有每种 RGB 颜色值的 rgb 图像?

关于Mongodb的其他知识