我使用 MediaPlayer 从网络播放一首 mp3 歌曲。数据源是 HTTP URL。
假设我们有以下播放状态。
歌曲时长:1:00
当前进度:0:10
当前缓冲进度 0:30
假设我想跳过歌曲的某些部分并向前搜索。我用 MediaPlayer.seekTo() 方法来做。如果我寻求缓冲位置 (0:20),它会正确执行。但是,如果我寻找一个尚未缓冲的位置 (0:40),则 MediaPlayer 会表现得很奇怪。它立即表明它已正确查找,而无需等待缓冲区填满。事实上,它继续在寻找之前的相同位置播放。从现在开始,MediaPlayer.getCurrentPosition() 方法会返回错误的位置。当播放结束并调用 OnCompletionListener.onCompletion 回调时,当前媒体播放器位置远高于整个歌曲持续时间。
有解决这个问题的想法吗?
最佳答案
我找到了解决此问题的方法:
首先创建一个OnBufferingUpdateListener
:
MediaPlayer.OnBufferingUpdateListener bufferingListener = new MediaPlayer.OnBufferingUpdateListener() {
public void onBufferingUpdate(MediaPlayer mp, int percent) {
//code to increase your secondary seekbar
}
};
然后在您的搜索栏事件 onProgressChanged
中执行以下操作:
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
int secondaryPosition = seekBar.getSecondaryProgress();
if (progress > secondaryPosition)
seekBar.setProgress(secondaryPosition);
}
这样您就可以保证用户无法将进度条拖动到未缓冲的位置(并且您还可以看到缓冲的内容)。
关于android - MediaPlayer.seekTo() 不适用于无缓冲位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3212688/