我使用 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 2.2 中得到修复。
然而,Android 2.2 在寻求缓冲位置时遇到了麻烦。尽管某个位置已被缓冲,MediaPlayer 仍会向服务器发送请求。
这可能与最终在 2.2 中修复的 bug(参考其中一条评论)有关 http://code.google.com/p/android/issues/detail?id=4124
如果您在 s3 中有音频和视频,那么您必须使用的一件事是使用预先签名的 url,然后您的eekTo 才能正常工作