openssl es : 音频回调模式

Posted

技术标签:

【中文标题】openssl es : 音频回调模式【英文标题】:opensl es : audio callback patterns 【发布时间】:2014-02-28 07:25:11 【问题描述】:

我正在一些 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”是扬声器回调。

【问题讨论】:

您是否尝试将线程优先级提高到THREAD_PRIORITY_AUDIO? @AlexCohn THREAD_PRIORITY_AUDIO 在这里有何帮助? @IgorGanapolsky:不使用高优先级线程来提供音频是错误的,但设置 THREAD_PRIORITY_AUDIO 并不能保证正确的行为。 【参考方案1】:

您可以查看audio-echosample,在 README.md 中,回调的不规则性也是其中提到的一个因素。将您的音频放入平台快速音频路径将改善回调不规则,它是依赖于平台的,可能值得一试。

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于openssl es : 音频回调模式的主要内容,如果未能解决你的问题,请参考以下文章

如何优雅的处理Nodejs中的异步回调

es6异步解决方案

IOS开发之简单音频播放器

设计模式之回调模式

Java设计模式补充:回调模式事件监听器模式观察者模式(转)

回调模式其他模式