视频帧数(图片)提取及保存方法---ffmpeg

视频帧数(图片)提取及保存方法—ffmpeg

环境:Ubuntu16.04、Python3.5、anaconda3
任务需要,要从视频里提取一定帧数的图片,查了不少方法,也试了不少方法,很多都不可行,也又可能是配置的问题,没细究,下面把亲测可行的拿出来分享,配上关键操作的输出效果:

用的是一个Python的工具—ffmpeg,非常强大,不仅可以提取视频里一定帧数的图片,也可以提取特定帧数的图片,也可以转换视频的格式。

先说一下安装方法:

  1. 先说明,我是在anaconda里搭建的环境,所以有些依赖项可能需要根据自己的环境去配置
conda install imageio scikit-image
  1. 在terminal里进入Python
python
import imageio
imageio.plugins.ffmpeg.download()

之后就会开始下载,下载完就ok了

说一下两个测试可行的方法:

method 1

import pylab
import imageio
import skimage
import numpy as np
filename='/home/will/Videos/level_1.mp4'
vid=imageio.get_reader(filename, 'ffmpeg')
for num,im in enumerate(vid):
    #print im.mean()
    image = skimage.img_as_float(im).astype(np.float64)
    fig = pylab.figure()
    fig.suptitle('image #{}'.format(num), fontsize=20)
    pylab.imshow(im)
pylab.show()

test1
上面测试的视频是之前录的RL的demo,根据自己视频的保存路径修改即可,注意是绝对路径

method 2
这个方法就简单了,直接使用ffmpeg工具,这里以一个叫testvideo.avi的视频做测试

ffmpeg -i testvideo.avi -vf select='eq(pict_type\,I)' -vsync 2 -f image2 frame-%03d.jpg -hide_banner

其实还可以设置很多参数的,但是我也一下子找不到太多,所以也希望有大神知道的,可以分享一下这部分,我把我知道的分享一下:
-i :后面的视频的名字也是路径,这个参数一定要放在最前面
-f :图片的命名格式及保存格式,不加这个也行,直接把保存格式写上就好
-s :分辨率,如-s 160×90则将图片的分辨率统一设定成160×90
-vsync :阻止每个关键帧产生多余的拷贝,其实只有两个值可以输入,1或2
-vf :表示过滤图形的描述,选择过滤器select会选择帧进行输出:包括过滤器常量
eq(pict_type\,I):PICT_TYPE_I 表示是I帧,即关键帧,如果I帧,7秒视频输出201个图片,换成2,7秒视频输出101个图片。
-vframes :指抽取的帧数
-ss :指起始时间
-t :持续时间,单位是秒
-r :指抽取的帧率,即从视频每秒钟抽取图片的数量,1即每秒抽取一帧

放下效果图:
图片的保存路径默认当前所在的路径
227秒的视频,生成了201张图片


加个题外话,ffmpeg转换视频格式命令:

ffmpeg -i input.mp4 output.avi

用ffmpeg按每秒8帧进行解帧,命令如下:

ffmpeg -i ${path} -vf fps=fps=8/1 -q 0 $IMGFOLDER/%06d.jpg

猜你喜欢

转载自blog.csdn.net/Will_Ye/article/details/84192734