Android mediaplayer仅在较新设备上出现音频故障/口吃
我有一个相当标准的mediaplayer对象,在我的应用程序中以onCreate和循环方式启动背景音乐。这个文件不是特别大,它是一个6MB的MP3。从onCreate:Android mediaplayer仅在较新设备上出现音频故障/口吃,android,audio,android-mediaplayer,nexus-5,nexus-10,Android,Audio,Android Mediaplayer,Nexus 5,Nexus 10,我有一个相当标准的mediaplayer对象,在我的应用程序中以onCreate和循环方式启动背景音乐。这个文件不是特别大,它是一个6MB的MP3。从onCreate: MediaPlayer mp; mp = MediaPlayer.create(MainActivity.this, R.raw.lostmexicancity); mp.setLooping(true); mp.setVolume(0.4f, 0.4f); mp.start(); 这在我的大多数测试设备上都能正常工作,包括老
MediaPlayer mp;
mp = MediaPlayer.create(MainActivity.this, R.raw.lostmexicancity);
mp.setLooping(true);
mp.setVolume(0.4f, 0.4f);
mp.start();
这在我的大多数测试设备上都能正常工作,包括老式手机、三星Galaxy Tab 2 10英寸平板电脑,甚至Nexus 4
不幸的是,我只在新设备上遇到问题,我在Nexus 5和新Nexus 10上遇到音频故障/口吃。这些问题只会在新设备上发生,通常是在正确播放几秒钟后,而不是立即发生。我的Nexus 4和5都运行Android 4.4.4,但问题只会发生在Nexus5上
当我暂停mediaplayer对象并在短时间内播放另一个对象(游戏中短时间战斗的战斗音乐)时,这个问题似乎会加剧,但即使没有这种额外的复杂性,故障也会发生
我读到安卓系统的新版本导致Mediaplayer出现问题,但我还没有找到解决办法或建议
有没有其他人遇到过这个问题,可以建议解决方法或解决方法?谢谢您抽出时间!我也注意到在我的Android设备上发生了这种情况 我注意到您没有调用Prepare(),这是播放音频之前的一个重要函数。 编辑——只有在使用new创建MediaPlayer时,才需要调用prepare,而不是使用内置的MediaPlayer.Create()创建MediaPlayer 至于在资源之间切换时的问题,我建议打电话给SeekTo()您希望播放音频并使用SeekComplete监听器等待该位置的确切时间。在评论中,我有一小行黑客代码,在调用开始后才在mediaPlayer上设置音量。这似乎可以减少口吃,但您可能会丢失第一小部分音频 我使用的是XamarinStudioC#,但即使您使用的是Java,这种方法也应该有效
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.SetAudioStreamType (Android.Media.Stream.Music);
mediaPlayer.SetDataSource ("dataSourcePath");
mediaPlayer.Looping = true;
//It is necessary to call prepare after setting the data source
mediaPlayer.Prepare ();
//Ensure the audio has seeked to the position you need
bool seekingComplete = false;
mediaPlayer.SeekComplete += (object sender, EventArgs e) => {
seekingComplete = true;
};
mediaPlayer.SeekTo(0);
//Forces the audio to complete seeking
while(seekingComplete == false)
{
//Here, you just wait 2 milliseconds at a time
//for this buffering and seeking to complete
await Task.Delay(2);
}
mediaPlayer.Start();
//Hacky way to prevent the glitch sound at the start is to set the
//volume after calling start
//mediaPlayer.SetVolume(0.4f, 0.4f);
我有一个类似的问题,并通过在查找之前总是暂停媒体播放器来解决。类似于以下的方法对我有效:
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
mediaPlayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
@Override
public void onSeekComplete(MediaPlayer mp) {
mp.start();
mp.setOnSeekCompleteListener(null);
}
});
}
mediaPlayer.seekTo(pos);
调用
MediaPlayer.create()
会自动准备音频。您绝对不应该再次调用它。从文档中可以看到:“为给定Uri创建MediaPlayer的便捷方法。如果成功,prepare()将已被调用,不能再次调用。“您找到解决此问题的方法了吗?”?