视频帧数(图片)和音频提取及保存方法&图片合成视频方法---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

视频截取

官方推荐把-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:图片合成视频会有很多个覆盖操作,此处一律同意覆盖
-rfps,这个是关键,设置多少帧/s,这里我自己设的是8,就是每八张图片合成1s的视频
-i:后接的第一个参数是输入的图片,我的图片都是以image%06d命名的,按自己图片的实际命名排序来设置,最后的是输出视频的格式。
ffmpeg -threads 2 -y -r 8 -i image%06d.jpg 1234.mp4

效果如图所示:
picturesjpg2mp4

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值