【发布时间】:2016-06-14 07:01:03
【问题描述】:
我在尝试使用 OpenSL ES 在运行 Android 6.0.1 的 Nexus 6 上实现低延迟流式音频播放时遇到了一个奇怪的问题。
我最初的尝试似乎遇到了饥饿问题,因此我在缓冲区完成回调函数中添加了一些基本的计时基准。我发现如果在我的应用程序打开时不断点击屏幕,音频可以正常播放,但如果我让它静置几秒钟,回调开始需要更长的时间。我能够始终如一地重现这种行为。有几点需要注意:
- “几秒”~= 3-5 秒,不足以触发换屏
- 我的应用程序的活动设置为 FLAG_KEEP_SCREEN_ON,因此无论如何都不应该发生屏幕变化
- 我没有采取任何措施来尝试增加音频回调线程的优先级,因为我的印象是 Android 已经为这些线程保留了高优先级
- 此行为发生在我的 Nexus 6 (Android 6.0.1) 上,但不在我也可用的 Galaxy S6 (Android 5.1.1) 上。
我看到的症状确实似乎是操作系统在与手机没有交互几秒钟后降低了音频线程的优先级。这是正确的吗?有什么办法可以避免这种行为?
【问题讨论】:
-
在运行 Android 4.4.2 的 Nexus 5 上也不会发生。
-
在播放期间记录线程优先级似乎表明在点击屏幕时线程优先级实际上并没有改变。也许触摸事件正在触发一个中断,这与调度程序可能返回的内容相混淆?
-
我在我的应用程序中遇到了同样的问题。只要我与屏幕互动,一切都会顺利进行。一旦我停止触摸屏幕,它就会在几次(大约 3-5 秒)后大量退出。当我再次开始与屏幕交互时,它又恢复了流畅的操作。屏幕交互是否有任何实际作用,或者手指是否使用特定的控件/按钮触发都无关紧要。只要手指在屏幕上移动,所有音频都会流畅运行。这在 Android 5.x 上不会发生,它只是从 6.0 开始,Android N 上也是如此。
-
这绝对不是应用程序的性能问题,我用一个预先计算的正弦波做了测试,行为是一样的。我使用nexus 6 进行测试。我还注意到,当应用程序“真正”进入后台时,行为完全相同。
标签: android c++ audio opensl nexus6