安卓媒体播放器音频故障/卡顿仅在较新的设备上



我有一个相当标准的媒体播放器对象,它在onCreate中启动,并在我的应用程序中循环播放背景音乐。 该文件不是特别大,它是一个6MB的MP3。 从开始创建:

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,但问题只发生在Nexus 5上。

当我暂停该媒体播放器对象并在短时间内播放不同的对象(游戏中短时间战斗的战斗音乐)时,这个问题似乎会加剧,但即使没有这种额外的复杂性,也会发生故障。

我已经读到较新版本的Android导致了媒体播放器的问题,但我还没有遇到修复或建议。

是否有其他人遇到过此问题,可以建议修复或解决方法? 谢谢你的时间!

我注意到我的Android设备上也发生了这种情况。

我注意到您没有调用 Prepare(),这是播放音频之前的一个重要函数。编辑 - 仅当使用new创建MediaPlayer时才需要调用准备,而不是使用内置的MediaPlayer.Create()。

至于您在源之间切换时的问题,我建议您调用 SeekTo() 您想要播放的音频中的确切时间,并使用 SeekComplete 侦听器等待该位置。在评论中,我有一小行黑客代码,直到调用开始后才在媒体播放器上设置音量。这似乎可以减少口吃,但您可能会丢失音频的前一小部分。

我使用的是Xamarin Studio C#,但即使您使用的是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);

最新更新