视频帧数(图片)和音频提取及保存方法&图片合成视频方法—ffmpeg
环境:Ubuntu16.04、Python3.5、anaconda3
任务需要,要从视频里提取一定帧数的图片和音频,查了不少方法,也试了不少方法,很多都不可行,也又可能是配置的问题,没细究,下面把亲测可行的拿出来分享,配上关键操作的输出效果:
用的是一个Python的工具—ffmpeg
,非常强大,不仅可以提取视频里一定帧数的图片,也可以提取特定帧数的图片,也可以转换视频的格式。
先说一下安装方法:
- 先说明,我是在anaconda里搭建的环境,所以有些依赖项可能需要根据自己的环境去配置
conda install imageio scikit-image
- 在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()
上面测试的视频是之前录的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即每秒抽取一帧
放下效果图:
图片的保存路径默认当前所在的路径
7秒的视频,生成了201张图片
加个题外话,ffmpeg
转换视频格式命令:
ffmpeg -i input.mp4 output.avi
用ffmpeg按每秒8帧进行解帧,命令如下:
ffmpeg -i ${path} -vf fps=fps=8/1 -q 0 $IMGFOLDER/%06d.jpg
视频截取
官方推荐把-ss
放在-i
前面,这样做剪辑出来的视频时间轴更精准,并且速度更快。
加上-accurate_seek
是准确裁剪视频,不加这个剪出来的视频会有所误差。
ffmpeg -ss 10 -t 15 -accurate_seek -i test.mp4 -codec copy cut.mp4
-ss
:指定开始
-i
:导入的视频文件
-t
:指定时长
比如-ss 10 -t 15 -i video.mp4
,则剪辑出来的视频,是原视频从第10s开始持续15s的片段。
-codec copy
:使用编码为copy复制源视频文件的编码格式
音频提取
ffmpeg -i apple.mp4 -f mp3 -vn apple.mp3
参数解释:
-i
表示input,即输入文件
-f
表示format,即输出格式:mp3, wav等
-vn
表示vedio not,即输出不包含视频
图片合成视频
利用ffmpeg
就可以完成这项任务了,下面是具体指令,再附上每个指令的说明:
-threads
:线程,这里可以设2个,加快视频生成速度
-y
:图片合成视频会有很多个覆盖操作,此处一律同意覆盖
-r
:fps,这个是关键,设置多少帧/s,这里我自己设的是8,就是每八张图片合成1s的视频
-i
:后接的第一个参数是输入的图片,我的图片都是以image%06d
命名的,按自己图片的实际命名排序来设置,最后的是输出视频的格式。
ffmpeg -threads 2 -y -r 8 -i image%06d.jpg 1234.mp4
效果如图所示: