【发布时间】:2021-04-08 18:47:19
【问题描述】:
我正在使用oboe 库来制作音乐应用程序。在那里,我通过将 PCM 浮点值写入给定的指针来制作音乐。我很少听到我能听到的underruns。我还使用以下双簧管 API 验证了这一点:
managedStream->getXRunCount();
文档说如下:
* An XRun is an Underrun or an Overrun. * During playing, an underrun will occur if the stream is not written in time * and the system runs out of valid data. * An underrun or overrun can cause an audible "pop" or "glitch".
我正在尝试调试问题。我发现这个awesome tutorial 是唐的。我使用以下内容捕获了 10 秒的 systrace,请注意,在这 10 秒内,我听到了 0 个可听的欠载弹出/点击声音:
systrace.py --time=10 -o trace.html -a com.example.app 音频调度 频率
aaRdy 调用的结果如下(蓝色框高度显示缓冲区中有多少样本,需要的样本越多高度越高):
这只是 aaRdy 调用的一小部分。我的缓冲区永远不会有 0 个样本。我检查了所有的。在唐写的文章中,他说:
但随后缓冲区开始为空,首先下降到 96 帧, 然后……哦,亲爱的……归零!在零时,我们保证有音频 出现故障,因为缓冲区中没有数据。
我的问题是看这篇文章,我可以保证如果蓝框是空的,那么就会出现欠载。但是,在我的 systrace 中,它永远不会为空,而且我没有听到过低的弹出点击,但 managedStream->getXRunCount();call 实际上返回了 12。我不确定是否存在欠载。
蓝框的减少是否意味着即使不是0也存在欠载?
【问题讨论】:
-
我对音频处理一无所知,但您可以看到
aaRdysystrace 计数器的值是如何在 Android 源代码中测量的:cs.android.com/android/platform/superproject/+/…。本质上,它是数据缓冲区队列中的完整帧数。当它为 0 时,可能意味着缓冲区已满。 -
我想你的意思是说'当它为 0 时,缓冲区是空的'
-
这是可用的完整帧数 (
mAudioEndpoint->getFullFramesAvailable()),表示可用于写入的缓冲区帧数。当它为 0 时,缓冲区完全被占用,必须丢弃一些东西。