ffmpeg是视频处理领域最常用的开源软件,用来对视频文件进行格式转换,抽帧截图、抽取音频、加水印、剪切、合并 等等操作,非常的强大。

这里只介绍下使用ffmpeg来抽取视频文件的某一帧, 博主碰到的需求是抽取视频某一帧来当作封面图,经过研究发现有两种方式可以实现这个需求。

按照固定时间点

按照固定时间点来截图,比较好容易理解,比如每次抽取视频第1s的画面,ffmpeg 命令如下:

# ./ffmpeg -ss 00:00:01 -t 00:00:02 -i ~/video_7783_aed4.mp4 -frames:v 1 -pix_fmt yuvj422p -f image2 /tmp/video_7783_aed4.mp4.jpg -y

视频是由一帧一帧的图片组成,但并不是每一帧画面都是完整存在的,所以按照固定时间点抽取的方式需要ffmpeg根据前后帧数据和视频压缩算法 来计算出某时间点的画面,会比较占用CPU。

抽取关键帧

视频关键帧(Video Keyframes)是用于视频压缩和视频编解码的帧,视频关键帧是包含了完整信息的帧,其他的非关键帧将会使用与关键帧的差值进行压缩。视频帧具体可以分为IPB帧三种:

  • I帧表示关键帧,是最完整的帧画面,一般视频封面都选择I帧;
  • P帧单预测帧,利用之前的I帧或P帧,采用运动预测的方式进行帧间预测编码;
  • B帧双向预测帧,利用双向帧进行预测编码;

一般情况下关键帧`I帧`是信息最多的帧,也是用途最多的帧。在视频检索和视频分类任务中一般都借助`I帧`来完成,在一个时长60s的视频中,可以抽取得到16个I帧、84个P帧和184个B,I帧数量少包含的信息却是最多的。

抽取关键帧作为视频的封面图是比较合适,且关键帧的画面比较完整,需要的CPU计算较少, ffmpeg命令如下:

# ./ffmpeg -i ~/video_7783_aed4.mp4 -vf "select=eq(pict_type\,I)" -frames:v 1 -pix_fmt yuvj422p  -vsync vfr -qscale:v 2 -f image2 /tmp/video_7783_aed4.mp4.jpg -y

风雨兼程路,雨雪初霁时