打开微信,使用扫一扫进入页面后,点击右上角菜单,
点击“发送给朋友”或“分享到朋友圈”完成分享
基于ffmeg进行抽帧共有四种方式:
抽取视频关键帧(I/P/B)
抽取视频场景转换帧
根据时间进行均匀抽帧
抽取指定时间的视频帧
视频关键帧(Video Key s)是用于视频压缩和视频编解码的帧,视频关键帧是包含了完整信息的帧,其他的非关键帧将会使用与关键帧的差值进行压缩。视频帧具体可以分为IPB帧三种:
I帧表示关键帧,是最完整的帧画面,一般视频封面都选择I帧;
P帧单预测帧,利用之前的I帧或P帧,采用运动预测的方式进行帧间预测编码;
B帧双向预测帧,利用双向帧进行预测编码;
一般情况下关键帧`I帧`是信息最多的帧,也是用途最多的帧。在视频检索和视频分类任务中一般都借助`I帧`来完成,在一个时长60s的视频中,可以抽取得到16个I帧、84个P帧和184个B,I帧数量少包含的信息却是最多的。
使用ffprobe提取出IPB帧的时间:
ffprobe -i 666051400.mp4 -v quiet -select_streams v -show_entries =pkt_pts_time,pict_typ
|
使用ffmpeg抽取IPB帧到jpg图片:
# 抽取I帧 ffmpeg -i 666051400.mp4 -vf "select=eq(pict_type\,I)" -vsync vfr -qscale:v 2 -f image2 ./%08d.jpg # 抽取P帧 ffmpeg -i 666051400.mp4 -vf "select=eq(pict_type\,P)" -vsync vfr -qscale:v 2 -f image2 ./%08d.jpg # 抽取B帧 ffmpeg -i 666051400.mp4 -vf "select=eq(pict_type\,B)" -vsync vfr -qscale:v 2 -f image2 ./%08d.jpg # 抽取I帧 ffmpeg -i 666051400.mp4 -vf "select=eq(pict_type\,I)" -vsync vfr -pix_fmt nv21 -f segment -segment_time 0.01 ./%08d.yuv # 抽取P帧 ffmpeg -i 666051400.mp4 -vf "select=eq(pict_type\,P)" -vsync vfr -pix_fmt nv21 -f segment -segment_time 0.01 ./%08d.yuv # 抽取B帧 ffmpeg -i 666051400.mp4 -vf "select=eq(pict_type\,B)" -vsync vfr -pix_fmt nv21 -f segment -segment_time 0.01 ./%08d.yuv #注:-segment_time需设置为小于1/fps的数 |
由于ffmpeg抽取帧并无法按照时间戳来命名,需要手动将ffprobe提取出来的帧时间与抽取帧的图片进行对应重命名。
2. 抽取视频场景转换帧
在视频中可以按照视频的镜头切换可以将视频分为不同的场景(scene boundarie)。视频场景抽取算法一般是使用帧间的相似差异程度来衡量,如果视频帧大于某一个阈值则认为是一个新的场景,否则不是一个新的场景。
使用ffmpeg抽取视频场景转换帧的命令:
# 其中0.1表示帧为新场景的概率 ffmpeg -i 666051400.mp4 -filter:v "select='gt(scene,0.1)',showinfo" -f null - 2>&
|
3. 均匀抽帧
通过ffmpeg根据时间均匀抽帧的命令行:
# -r 指定抽取的帧率,即从视频中每秒钟抽取图片的数量。1代表每秒抽取一帧。 ffmpeg -i 666051400.mp4 -r 1 -q:v 2 -f image2 ./%08d.000000.jp
|
4. 抽取制定时间的帧
通过ffmepg抽取指定时间的帧:
# 耗时0.07s ffmpeg -ss 00:00:30 -i 666051400.mp4 -vframes 1 0.jpg # 耗时0.68s ffmpeg -i 666051400.mp4 -ss 00:00:30 -vframes 1 0.jpg |
热门帖子
精华帖子