MediaPlayer.seekTo()无法用于未缓冲位置

12

我使用MediaPlayer从网络播放单个mp3歌曲,数据源为HTTP URL。

假设我们有以下播放状态:

歌曲时长:1:00

当前进度:0:10

当前缓冲进度:0:30

假设我想要跳过歌曲的一部分并向前搜索。我可以使用MediaPlayer.seekTo()方法实现。如果我搜索已缓冲的位置(0:20),则操作将正确执行。但是,如果我搜索尚未缓冲的位置(0:40),MediaPlayer会表现得奇怪。它立即指示已正确搜索到该位置,而不等待缓冲区填充。事实上,它继续在之前跳过的位置播放。从现在开始,MediaPlayer.getCurrentPosition()方法返回错误的位置。当播放达到结尾并调用OnCompletionListener.onCompletion回调时,当前媒体播放器的位置比整首歌曲的时长高得多。

有什么解决方法吗?

3个回答

4
我为这个问题找到了一个解决方法:
首先,您需要创建一个“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);
}

使用此功能,您可以确保用户无法将进度条拖动到未缓冲的位置(并且您可以看到已缓冲的内容)。


3

据我所知,Android 2.2只在某些设备上修复了此问题。

然而,Android 2.2在寻找缓冲位置时存在问题。即使已经缓冲了一个位置,MediaPlayer仍会向服务器发送请求。


1

谢谢。看起来这就是原因。 - plugmind
是的,缺陷跟媒体播放器有关的问题在缺陷追踪器中有几个…… ;) 顺便说一句:如果这个回答有帮助,请接受回复(绿色勾号)。 - Mathias Conradt
1
这个漏洞仍然适用于2.2摩托罗拉Droid设备,因为出于某种原因,它们仍然使用PVPlayer而不是stagefright / awesomeplayer。目前最好的解决方法是使用jBilbo的解决方案,或从SD卡下载并播放。 - brack
我在HTC Desire 2.2版本中遇到了这个问题。 - Samuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接