MediaPlayer.seekTo() 不适用于无缓冲位置

问题描述 投票:0回答:4

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

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

歌曲时长:1:00

当前进度:0:10

当前缓冲进度0:30

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

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

android media-player
4个回答
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
投票

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


0
投票

如果您在 s3 中有音频和视频,那么您必须使用的一件事是使用预先签名的 url,然后您的eekTo 才能正常工作

© www.soinside.com 2019 - 2024. All rights reserved.