VideoView和MediaPlayer seekTo始终从头开始

时间:2017-06-29 15:57:40

标签: android android-mediaplayer android-videoview

我在使用VideoView播放视频并恢复视频时遇到了一些问题。

这是我的代码的一部分:

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();
        mp.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
            @Override
            public void onSeekComplete(MediaPlayer mp) {
                Log.d("V", "onSeekComplete1 " + videoView.getCurrentPosition());
                videoView.start();
                Log.d("V", "onSeekComplete1 " + videoView.getCurrentPosition());
            }
        });
    }
});
videoView.setVideoURI('some local uri');

在某些时候,我使用以下方式暂停视频: videoView.pause();

按下按钮后,我会在某个时间寻找视频,例如。 10秒(10 000 ms)。

@OnClick(R2.id.ivMove)
void clickMove() {
   videoView.seekTo(10000);
}

之后在日志中我看到:

onSeekComplete1 10000
onSeekComplete2 0

所以在调用videoView.start()后,它就开始播放视频了!

但是当我在没有寻求视频的情况下调用start()时(例如,一个按钮调用pause()和第二个调用start(),则视频正在正常播放 - 从暂停时开始,而不是从开始播放。

你能告诉我我做错了吗?

4 个答案:

答案 0 :(得分:2)

问题是由MediaPlayer引起的 - 它正在寻找最接近视频的关键帧,结果我的测试视频每隔约30秒就有一个关键帧。

我改为ExoPlayer https://github.com/google/ExoPlayer - 它可以寻求确切的时间。

答案 1 :(得分:1)

MediaPlayer seekTo方法有一个新的重载。它具有第二个int参数,您可以在其中传递SEEK_CLOSEST常量。根据Google的说法,“此模式与seekTo(long,int)一起使用,可将媒体位置移动到与最接近给定时间或在给定时间的数据源关联的帧(不一定是关键帧)。”在测试自己的应用程序时,它解决了API级别> = 26的问题。我不确定在API级别26之前是否有任何好的选择。

答案 2 :(得分:0)

尝试使用videoView.resume()而不是start()

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();
        mp.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
            @Override
            public void onSeekComplete(MediaPlayer mp) {
                Log.d("V", "onSeekComplete1 " + videoView.getCurrentPosition());
                videoView.resume();
                Log.d("V", "onSeekComplete1 " + videoView.getCurrentPosition());
            }
        });
    }
});
videoView.setVideoURI('some local uri');

答案 3 :(得分:0)

尝试此解决方案。它就像魅力一样。...

   videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
            mp.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
                @Override
                public void onSeekComplete(MediaPlayer mp) {
                    mp.start();
                }
            });

        }
    });