0

openSL在其中一个Android apps. 当应用程序在前台时,回调非常有规律。麦克风回调大约每 10 毫秒调用一次,扬声器回调也是如此。但是,如果我将我的应用程序放在后台并打开浏览器(或其他应用程序),我会看到在打开浏览器(或浏览)时触发了“风暴”的回调。有没有办法解决这个问题?为什么会这样?openSL 是否会补偿无法执行回调的一段时间?(就像它试图赶上一样)。

我的源代码在C,我在Jelly Bean 4.3.

我试图增加AudioTrackand的线程优先级AudioRecorder,它似乎确实有帮助,但我不确定这是要走的路。

其他问题

所以你是说,即使增加线程优先级,你也可能会收到大量回调,你应该丢弃那些?

这是一个好的解决方案吗?您将丢弃麦克风数据包(或耗尽扬声器数据包的来源),对吗?如果你不丢弃麦克风数据包,麦克风数据包的接收者会将麦克风数据包的突发解释为过度抖动,对吗?

更重要的是:我手动增加了 AudioTrack 和 AudioRecorder 的线程优先级,并将 sched 策略更改为轮询。它需要 root 访问权限和安装 BusyBox(带有用于更改线程优先级/调度策略的命令行工具)。这是如何从 C 以编程方式完成的?我想确保增加的是单个线程优先级,而不仅仅是我的应用程序(进程)的优先级。

4

1 回答 1

1

是的,这是设计使然。尝试将线程优先级推高是解决问题合法方法。确保使用本机缓冲区大小和采样(请参阅Android 上的低延迟音频播放)以获得最佳效果。您仍然应该准备好丢弃大量回调,因为无法保证它们永远不会发生。您还应该尝试减少应用程序在后台时的总体 CPU 消耗和 RAM 足迹。

于 2013-12-18T17:51:46.210 回答