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

标签 android media-player

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

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

歌曲时长:1:00

当前进度:0:10

当前缓冲进度 0:30

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

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

最佳答案

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

首先创建一个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);
}

这样您就可以保证用户无法将进度条拖动到未缓冲的位置(并且您还可以看到缓冲的内容)。

关于android - MediaPlayer.seekTo() 不适用于无缓冲位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3212688/

相关文章:

android - Android 原生视频播放器 API 杠杆 16 的源代码

video - 如何向 Ziggeo Player 添加屏幕录制功能?

android - MediaPlayer 没有暂停音频文件

android - android 2.1 xml 可绘制对象中的错误?

java - 使用 Volley 通过 GSON 解析 JSON 时出错

android - 重命名内部存储中的文件

opencv - 手势识别 OpenCV(用于媒体播放器)

android - 在 TextView 中使用 'ellipsize' 并仅在必要时拉伸(stretch) View

android - 自定义 Android TabHost 慢 fragment

ffmpeg - "struct AVCodec *codec"中的 "struct AVCodecContext"代表什么?