我在一些安卓平台(>= 4.1.1)上工作,在这些平台上,openSL ES音频驱动程序显示出非常不规则的回调模式。
我的期望是,如果我将音频驱动程序配置为每10ms给我回调一次,那么我大约每10ms就会得到一次回调(大约需要几毫秒)。理想情况下,回调模式如下所示:
T= 0ms :扬声器回调
T= 1ms :麦克风回调
T= 10ms :扬声器回调
T= 11ms :麦克风回调
T= 20ms :扬声器回调
T= 21ms :麦克风回调
T= 30ms :扬声器回调
T= 31ms :麦克风回调
麦克风回调获取接收到的麦克风数据并将其写入环形缓冲区。然后,它向另一个线程发送一个“信号”,以唤醒并处理麦克风数据。麦克风数据的处理导致产生10ms的扬声器数据。该扬声器数据被写入扬声器环形缓冲区,扬声器回调从该缓冲区读取数据。
如果回调模式看起来像我上面描述的那样,其中扬声器和麦克风回调轮流进行,那么一切都很好。
然而,如果回调模式是不规则的,事情就会变得一团糟。例如:麦克风回调的爆发将使扬声器振铃缓冲器的大小变得非常大。如果我--无论出于什么原因--没有得到相同类型的扬声器回调,我会突然在扬声器路径中有很大的延迟。
另一个问题是,如果我收到大量的扬声器回调。在这种情况下,扬声器环形缓冲区将耗尽样本,我将不得不返回静默数据包。
所以我想知道对于这种类型的问题是否有某种标准的解决方案?我什么也想不到。
以下链接是回调模式的示例:
http://wikisend.com/download/143908/timestamps.txt
其中'1‘为麦克风回调,'2’为扬声器回调。
发布于 2015-08-26 08:07:00
您可以查看README.md中的audio-echo示例,回调的不规则性也是其中提到的一个因素。将你的音频放入平台的快速音频路径会改善回调的不规则性,这是平台相关的,可能值得一试。
发布于 2014-04-03 14:14:11
我刚刚开始使用OpenSL ES,所以这可能是一个愚蠢/不正确的答案,但是...不要使用扬声器回调。然后你的环形缓冲区也会消失。只需在麦克风回调中直接将播放缓冲区排队即可。
这至少可以绕过一些由不规则回调引起的问题。我认为你仍然需要某种同步逻辑来控制麦克风和扬声器之间的延迟。不规律的回调听起来像是性能问题的征兆,请尝试提高线程优先级。当然,由于Android/Linux不是一个实时系统,您的应用程序偶尔仍需要处理回调中的间隙或突发事件(如果太多,则丢弃数据;如果太少,则填充)。读取缓冲区队列状态以查看其缓冲区有多满。
https://stackoverflow.com/questions/22088854
复制相似问题