openSL ES Android:不规则的音频回调

时间:2013-12-18 06:15:41

标签: android c audio android-ndk opensl

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

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

我曾尝试增加AudioTrackAudioRecorder的主题优先级,但它似乎有所帮助,但我不确定是否可行。

其他问题

所以你说,即使增加了线程优先级,你也可能会得到一连串的回调,你应该放弃那些?

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

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

1 个答案:

答案 0 :(得分:1)

是的,这是设计的。试图将线程优先级提高是 合法的解决方法。确保使用本机缓冲区大小和采样(请参阅Low-latency audio playback on Android)以获得最佳结果。你仍然应该准备好丢弃连线回拨,因为没有办法保证它们永远不会发生。您还应该尝试在应用程序处于后台时减少应用程序的整体CPU消耗和RAM占用空间。