7

我有一个相当标准的媒体播放器对象,它在 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();

这适用于我的大多数测试设备,包括旧手机、三星 Galaxy Tab 2 10" 平板电脑,甚至 Nexus 4。

不幸的是,我在 Nexus 5 和较新的 Nexus 10 上遇到音频故障/断断续续的较新设备时遇到问题。这些问题仅发生在较新的设备上,通常在正确播放几秒钟后发生,而不是立即发生。我的 Nexus 4 和 5 都运行 Android 4.4.4,但问题只发生在 Nexus 5 上。

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

我已经读到较新版本的 Android 导致 Mediaplayer 出现问题,但我还没有找到修复或建议。

有没有其他人遇到过这个问题,可以提出修复或解决方法?感谢您的时间!

4

2 回答 2

0

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

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

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

我使用的是 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);
于 2015-05-26T21:45:26.987 回答
0

我遇到了类似的问题,并通过在搜索之前始终暂停媒体播放器来解决它。以下内容对我有用:

if (mediaPlayer.isPlaying()) {
    mediaPlayer.pause();
    mediaPlayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
        @Override
        public void onSeekComplete(MediaPlayer mp) {
            mp.start();
            mp.setOnSeekCompleteListener(null);
        }
    });
}
mediaPlayer.seekTo(pos);
于 2018-10-10T19:57:34.367 回答