【问题标题】:MediaPlayer.seekTo() does not work for unbuffered positionMediaPlayer.seekTo() 不适用于无缓冲位置
【发布时间】:2010-07-09 12:49:14
【问题描述】:

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

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

歌曲时长:1:00

当前进度:0:10

当前缓冲进度 0:30

假设我想跳过歌曲的某些部分并向前搜索。我用 MediaPlayer.seekTo() 方法来做。如果我寻求缓冲位置(0:20),它会正确执行。但是,如果我寻找一个尚未缓冲的位置(0:40),MediaPlayer 的行为就会很奇怪。它立即表明它已正确查找,而无需等待缓冲区填充。事实上,它继续在寻找之前的相同位置播放。从现在开始 MediaPlayer.getCurrentPosition() 方法返回错误的位置。当播放结束并调用 OnCompletionListener.onCompletion 回调时,当前媒体播放器的位置远高于整个歌曲的持续时间。

有解决这个问题的想法吗?

【问题讨论】:

    标签: android media-player


    【解决方案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);
    }
    

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

    【讨论】:

      【解决方案2】:

      据我所知,它已在某些设备的 Android 2.2 中得到修复。

      然而,Android 2.2 搞砸了寻求缓冲位置。尽管位置已被缓冲,但 MediaPlayer 向服务器发送请求。

      【讨论】:

        【解决方案3】:

        这可能与最终在 2.2 中修复的错误(指其中一个 cmets)有关 http://code.google.com/p/android/issues/detail?id=4124

        【讨论】:

        • 谢谢。好像是这个原因。
        • 是的,在与媒体播放器相关的错误跟踪器中存在一些错误...... ;) 顺便说一句:如果回答有帮助,请接受回复(绿色复选标记)
        • 这个错误仍然适用于 2.2 摩托罗拉 Droid 设备,因为无论出于何种原因,它们仍然使用 PVPlayer 而不是 stagefright/awesomeplayer。最佳解决方法 atm 是 jBilbo 的解决方案,或者从 SD 下载和播放。
        • 我在 2.2 中遇到了 htc 渴望中的这个问题
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多