首页 文章

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

    它's probably related to the bug that' s(指其中一条评论)最终修复于2.2 http://code.google.com/p/android/issues/detail?id=4124

  • 1

    我找到了解决此问题的方法:

    首先创建一个 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会向服务器发送请求 .

相关问题