代码之家  ›  专栏  ›  技术社区  ›  plugmind

mediaplayer.seekto()不适用于无缓冲位置

  •  12
  • plugmind  · 技术社区  · 16 年前

    我用MediaPlayer从网络上播放一首MP3歌曲。数据源是HTTP URL。

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

    歌曲时长:1:00

    当前进度:0:10

    当前缓冲进度0:30

    比如说,我想跳过一首歌的某一部分,向前看。我用mediaplayer.seekto()方法来实现。如果我寻求缓冲位置(0:20),则正确执行。但如果我想找一个还没有缓冲的位置(0:40),媒体播放器就会表现得很奇怪。它立即指示它已正确查找,而不等待缓冲区填充。事实上,它继续在寻找之前的同一位置比赛。从现在起,mediaplayer.getcurrentPosition()方法返回错误的位置。当播放结束且OnCompletionListener.OnCompletion回调被称为当前媒体播放器位置远高于整首歌曲的持续时间。

    有什么解决办法吗?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Mathias Conradt    16 年前

    它可能与最终在2.2中修复的bug有关(参考其中一条注释)。 http://code.google.com/p/android/issues/detail?id=4124

        2
  •  4
  •   jBilbo    15 年前

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

    首先你创建一个 OnBufferingUpdateListener :

    MediaPlayer.OnBufferingUpdateListener bufferingListener = new MediaPlayer.OnBufferingUpdateListener() {
        public void onBufferingUpdate(MediaPlayer mp, int percent) {
            //code to increase your secondary seekbar
        }
    };
    

    然后在你的seekbar活动中 onProgressChanged 执行以下操作:

    public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser) {
        int secondaryPosition = seekBar.getSecondaryProgress();
        if (progress > secondaryPosition)
            seekBar.setProgress(secondaryPosition);
    }
    

    这样可以保证用户不能将进度条拖到未缓冲的位置(也可以看到缓冲的内容)。

        3
  •  3
  •   plugmind    16 年前

    据我所知,它已经在Android2.2的某些设备中修复了。

    然而,android 2.2在寻求缓冲位置上搞得一团糟。虽然一个位置已经被缓冲,但MediaPlayer会向服务器发送一个请求。