2013-12-18 50 views
0

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

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

我试图增加AudioTrackAudioRecorder线程的优先级,并且它似乎帮助,但我不知道那是办法走。

其他问题

你是说,即使增加线程优先级你可能会得到回调一阵,你应该放弃那些?

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

更重要的是:我手动增加了AudioTrack和AudioRecorder的线程优先级,并将sched策略改为循环法。它需要同时访问和安装BusyBox(随命令行util改变线程优先级/调度策略)。这是如何通过编程从C完成的?我想确保它是增加的单个线程优先级,而不仅仅是我的应用程序(进程)的优先级。

+0

您是否因*缺失*回调而遭遇风暴?或者超出你的预期? – marko

+0

我在他们缺席之后得到了延迟回调的风暴。 – user1884325

+0

当您的应用程序进入后台时,您是否遇到任何音频断断续续或退出? – rmigneco

回答

1

是的,这是设计。试图推动线程优先级最高的是合法的解决方法。确保使用原生缓冲区大小和采样(请参阅Low-latency audio playback on Android)以获得最佳结果。您仍然应该准备放弃回调突发,因为无法保证它们永远不会发生。您还应该尝试在应用程序处于后台时减少总体CPU消耗和RAM脚标。

+0

所以你说,即使线程优先级增加,你可能会遇到一连串的回调,你应该放弃这些回调?这是一个很好的解决方案吗?您将丢弃麦克风包(或者耗尽扬声器包的来源),对吧?如果不丢弃话筒包,话筒包的接收器会将话筒包的突发解释为过度的抖动,对吧?我编辑了我原来的问题。你能否解决其他问题?谢谢。 – user1884325

+0

更多答案:我没有说即使你努力尝试,爆发仍然会发生,这很好。但不幸的是,没有任何保证,回调将始终以可忽略的抖动到达。不要杀死信使。 –

+0

关于生根和调整线程调度器,methinks这是一个错误的路径。如果您正在构建基于Android的定制硬件解决方案,那么您可能应该首先将一些RT补丁应用于内核。否则,即使不太经常,爆发仍会发生。无论如何,您[可以设置单个线程优先级](https://groups.google.com/forum/m/#!topic/android-developers/b2SKprSxPvw)与Process最大一样高。THREAD_PRIORITY_URGENT_AUDIO = -19;',请参阅 –