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是实现这一点的唯一本机方法。