使用FFmpeg提取视频中的图像(根据帧间隔、时间间隔)

前言

为了对视频做一些处理,需要提取视频中的图像,根据不同需求有时候可能需要按一定时间间隔帧间隔来提取视频中的帧,目的是为了处理提高效率减少内存的占用,使用OpenCV也可以完成这一功能,不过相对于FFmpeg来说,处理视频的效率要慢不少,对于数量比较大的视频处理建议使用FFmpeg来进行。

通过FFmpeg获取视频的总帧数

ffprobe <input> -select_streams v -show_entries stream=nb_frames -of default=nk=1:nw=1 -v quiet

通过FFmpeg获取视频的总时长

ffprobe <input> -select_streams v -show_entries stream=duration -of default=nk=1:nw=1 -v quiet

按间隔帧来提取视频中的帧

ffmpeg -i 10021502.mp4 -vf "select=between(n\,84\,208)*not(mod(n\,4))" -vsync 0 ./pkl/image_%05d.jpg

主体是一个select 的过滤语句:

其中:between(n,*) 是指 从第几帧到第几帧之间进行提取...

   not(mode(n\, K))是指每隔几帧输出一帧。

使用between可以指定需要提取开始帧和结束帧的位置,如果想要对视频中所有的帧进行间隔采样,命令如下

command_extract = "select=(gte(n\,%d))*not(mod(n\,%d))"%(60,60)
com_str = 'ffmpeg -i ' + video_path + ' -vf "%s" -vsync 0 '%command_extract + save_jpg_tmp_path + '/%06d.jpg'

command_extract中的60指的是间隔的帧数,video_path指的是视频的路径,save_jpg_tmp_path指的是导出视频中的图片存放的路径

按时间间隔取帧

ffmpeg -i <input> -vf "select=(gte(t\,120))*(isnan(prev_selected_t)+gte(t-prev_selected_t\,120))" -vsync 0 image_%05d.jpg

上面命令中的120的单位是s,指每120s提取视频中的一帧图像

参考:

https://blog.csdn.net/sparkexpert/article/details/83891389

https://stackoverflow.com/questions/32043680/ffmpeg-select-frames-at-position-of-video

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修炼之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值