我有一个同时播放多首曲目的音频应用,每个都有自己的mediaPlayer
。每条赛道都相当长,超过两分钟。
只要将曲目编码为ogg文件,一切都在Android 4.x上运行良好。我还没有遇到运行stock 4.x的设备,这个设置有任何音频问题。
但是在Lollipop 5.x上有各种各样的音频问题 - 口吃,音轨切断,蓝牙音频几乎从来没有用过。
我发现进入5.x中的Developer选项并取消选中“使用Nuplayer(实验性)”可以立即解决这些问题,并恢复到4.x级别的性能。
有没有办法可以通过编程方式强制我的应用程序使用4.x媒体堆栈(我相信它叫做Awesomeplayer?)而不是使用新的Nuplayer系统?至少在我能发现Nuplayer问题的来源之前?
答案 0 :(得分:3)
<强>更新强>: 在MediaPlayer上设置部分唤醒锁定可解决此问题:
playerToPrepare.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK);
部分唤醒锁不应该有太大的影响,而且当播放完成时,MediaPlayer本身就会清除它。
- 原始答案---
所以,我终于找到了一种方法来安全地检测是否会在棒棒糖上使用或不使用NuPlayer
。似乎现在最好的策略是通知用户打开开发者设置并启用AwesomePlayer
,直到Google修复NuPlayer
。
遗憾的是,没有好的方法可以为用户更改此设置,除非您已将其设置为系统应用程序,否则我们只能读取其值。
此方法检查Android的系统属性值,以查看用户是否已在“开发者设置”下启用了AwesomePlayer。由于Lollipop默认启用NuPlayer,如果禁用此值,我们将知道将使用NuPlayer。
将SystemProperties.java删除到您的项目中以便访问以读取系统属性,不要将其包名称从android.os
更改(它调用其相应的JNI方法,因此需要保持不变)。
您现在可以检查手机是否为Lollipop / 5.0,如果启用了AwesomePlayer
,并且如果不是(例如通过打开开发者设置)则相应地采取行动:
public void openDeveloperSettingsIfAwesomePlayerNotActivated(final Context context) {
final boolean useAwesome = SystemProperties.getBoolean("persist.sys.media.use-awesome", false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !useAwesome) {
final Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
context.startActivity(intent);
}
}
答案 1 :(得分:1)
启用/禁用NuPlayer没有帮助。但我用一个友好的用户界面管理了唤醒锁部分。今晚我会看看KitKat的SysCtl并将其与Lollipop上的SysCtl进行比较,也许我会发现一些有趣的东西。
因此,蓝牙口吃与5.02上的哑内核有关,一旦屏幕关闭就会使播放断断续续。我使用了部分唤醒锁,因此在使用此应用程序关闭屏幕后,cpu保持活动状态。有用。没有更多的口吃。对于需要高采样率的扬声器,我只是将CPU调节器切换到了性能。 这是一种解决方法,但部分唤醒锁应该特别适用于蓝牙耳机。这是应用的链接https://play.google.com/store/apps/details?id=eu.thedarken.wl&hl=en