Android:在搜索栏上逐帧搜索视频已更改

Android:在搜索栏上逐帧搜索视频已更改,android,android-videoview,seekbar,Android,Android Videoview,Seekbar,我在我的项目中使用了视频视图和搜索栏,下面是搜索栏更改时的当前代码 seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override public void onStartTrackingTouch(S

我在我的项目中使用了视频视图和搜索栏,下面是搜索栏更改时的当前代码

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {

            if (fromUser) {
                // this is when actually seekbar has been seeked to a new
                // position
                videoView.seekTo(progress);
            }
        }
    });
问题是:当绘制seekbar时,视频搜索不平滑,这是跳帧

例如:

第1点至第2点:

持续时间:1秒

帧数:3


如果通过videoView.start()播放视频,则可以,但如果从点1到点2绘制seekbar,则跳过第2帧。

在编码视频流时,通常会有一个称为I帧(I-Picture)或关键帧的帧,这意味着该帧具有大量信息,可以用于解码整个帧。为了减少空间量,所有帧不编码为关键帧,而是编码为P(预测)帧或预测帧,这意味着您可以在关键帧的帮助下解码P帧

因此,在搜索操作期间,在这种情况下,在给定的持续时间内对最近的关键帧进行搜索。例如,如果用户的搜索时间为40秒,最近的关键帧为35秒,则搜索时间为35秒,而不是40秒

您仍然可以尝试以下操作,看看它是否有效。到I个图片之间的距离通常为0.5秒。因此,与其寻找每毫秒,不如尝试用秒直接跳转到I图片

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {

        if (fromUser) {
            // this is when actually seekbar has been seeked to a new
            // position
            videoView.seekTo(progressx1000);
        }
    }
enter code here

尝试在onStopTrackingTouch()中调用它,如下所示:

public void onStopTrackingTouch(SeekBar seekBar) {
     videoView.seekTo(seekBar.getProgress());
}
我在项目中就是这样做的。

VideoViewer seekTo()函数有点有限,并且假设您想回到关键帧。但是,MediaPlayer允许您覆盖该选项:

mediaPlayer.seekTo(time, MediaPlayer.SEEK_CLOSEST);
其他值包括:查找上一次同步、查找下一次同步、查找最近的同步

例如,如果您还没有MediaPlayer的实例,您可以在VideoViewer的onPreparedListener中访问它


有关MediaPlayer seekTo的详细信息,请参阅。

@Nicky使用此解决方案,您面临什么问题?应该有用!请看此视频(案例请参见“更改进度”)。正如你所看到的,当我拖动seekBar时,它是滞后的。如果我把seekTo放在TopTrackingTouch上,只有当我停止拖动时才是seekTo。谢天谢地,我的问题是video.seekTo()跳过帧,因此滑动搜索栏时视频预览不平滑。这将不起作用,它将始终搜索到关键帧。Mediacodec是实现这一点的唯一本机方法。