1

我正在一些 Android 平台 (>= 4.1.1) 上工作,其中 openSL ES 音频驱动程序表现出非常不规则的回调模式。

我的期望是,如果我将音频驱动程序配置为每 10 毫秒给我一次回调,我会大约每 10 毫秒得到一次回调(给或需要几毫秒)。理想情况下,回调模式看起来像这样:

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”是扬声器回调。

4

2 回答 2

2

您可以查看README.md 中的音频回声示例,回调的不规则性也是其中提到的一个因素。将您的音频放入平台快速音频路径将改善回调不规则,它是平台相关的,可能值得一试。

于 2015-08-26T00:06:59.917 回答
0

我刚开始使用 OpenSL ES,所以这可能是一个愚蠢/不正确的答案,但是......不要使用扬声器回调。然后你的环形缓冲区也会消失。只需将您的播放缓冲区直接排入麦克风回调中即可。

这至少可以解决一些由不规则回调引起的问题。我认为您仍然需要某种同步逻辑来控制麦克风和扬声器之间的延迟。不规则的回调听起来像是性能问题的迹象,请尝试提高线程优先级。当然,由于 Android/Linux 不是实时系统,因此您的应用程序偶尔仍需要处理回调中的间隙或突发(如果数据太多则丢弃数据,如果太少则填充)。读取缓冲区队列状态以查看其缓冲区已满。

于 2014-04-03T06:14:10.560 回答