最近做视频处理时,用opencv里的cvSetCaptureProperty,定位到上一帧,然后再抓取这一帧图像,这样不停循环,实现视频的倒退播放。但是发现处理的时候有明显的延时,视频卡顿。于是用Cmake看了一下opencv源代码,发现其实是用ffmpeg这个开源的库做的,在网上找了一些代码,顺利解码,但是我要一帧一帧定位的时候,出现很奇怪的现象,每隔几十帧,图像会跳动一次,也就是中间的图像都是一样的,没有变过。
原因跟视频的压缩方式有关系。一个视频,总是分成若干个组(GOP),每个组只有第一帧是完全清晰具备所有细节的图像,也叫做关键帧,这个组里的其他帧记录的都是不完全的信息,可以理解为,只记录了与第一帧有差异的信息。因此,我在利用函数av_seek_frame进行定位,得到的总是每个组关键帧图像。假如30帧为一个组,那么我得到的就是第1帧,第31帧,第61帧,依次类推。这就是会出现跳动的原因。