这一篇文章推荐一个软件,ffmpeg。这款软件可以很方便的进行图片与视频的处理,包括将图片转视频,图片转gif,视频转图片,获取视频关键帧等。
- 一份帮助文档:ffmpeg的简单使用
- 下载地址 : ffmpeg download
下面介绍一下他的用法。
文章目录(Table of Contents)
一些基本的参数
-c
:指定编码器-c copy
:直接复制,不经过重新编码(这样比较快)-c:v
:指定视频编码器-c:a
:指定音频编码器-i
:指定输入文件-an
:去除音频流-vn
: 去除视频流-preset
:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。-y
:不经过确认,输出时直接覆盖同名文件。
图片转视频
基本用法
ffmpeg -f image2 -i f:/images/%d.jpg test.mp4
在这里图片的文件名从0开始依次递增,下面是参考链接:
控制码率
使用framerate来控制将图片输入时的帧率
ffmpeg -framerate 30 -i F:/bad_apple_num/%d.jpg -vf scale=600:480 bad_apple.mp4
使用-r可以控制输出时的帧率,这里是输入和输出时的帧率不一样
ffmpeg -framerate 10 -i input -r 25 output.mp4
下面看一个经常使用的,来源How to encode a video at 30 FPS from images taken at 7 FPS
ffmpeg -framerate 30 -i img%03d.png -c:v libx264 -pix_fmt yuv420p -crf 23 output.mp4
下面是一端解释:
This reads the input at 30 fps (the -framerate 30 option) and encodes it using the libx264 codec with constant rate factor of 23 (the -crf 23 option).
一些报错
当遇到错误"width not divisible by 2"
时候,我们的解决方法是加上-vf scale=800:400
视频转图片
连续截图
ffmpeg -i ./test/video.mpg -r 1 -f image2 temp/%05d.png
上面这个例子是将./test/目录下面的video.mpg按照每秒截取一张图片的频率方式,并且将得到的图片自然数递增的顺序命名规则命名,并且保存./temp下面。
如果你想每秒10帧,那就将1改成10:
ffmpeg -i ./test/video.mpg -r 10 -f image2 temp/%05d.png
图片的格式也可以是jpg, png, bmp。如:
ffmpeg -i ./test/video.mpg -r 10 -f image2 temp/%05d.bmp
就会把视频转换为位图,位图的格式默认是16位色(这个有待进一步验证,因为我的实验刚好能被转换成16位色的),关于这个如果有人发现有不一样的结果,希望共享一下。
特定时间点截图
- ffmpeg -ss 00:10:00 -i "Apache Sqoop Tutorial.mp4" -y -f image2 -vframes 1 test.png
- # 或是
- ffmpeg -ss 10 -i input.flv -y -f image2 -vframes 100 -s 352x240 b-%03d.jpg
下面是关于他的参数解释:
- -i 输入文件
- -y 覆盖
- -f 生成图片格式
- -ss 开始截图时间 seconds or in hh:mm:ss[.xxx] 如果截图开始时间越接近篇尾,所花费的时间就会越长
- -vframes 截图帧数 或者 使用 -t : 截图时长 seconds, or hh:mm:ss[.xxx]
- -s 图片宽高比
- b-%3d.jpg 格式化文件命名,会生成 b-001.jpg,b-002.jpg 等。
字幕的插入
给视频插入字幕
- ffmpeg -i myvideo.mp4 -vf subtitles=semester-abroad-program.ass -c:s mov_text outfile.mp4
给音频插入字幕
注意, 在给音频插入字幕的时候, 我们需要一张背景图片.
- ffmpeg -loop 1 -y -i black-background-09.jpg -i semester-abroad-program.mp3 -vf subtitles=semester-abroad-program.ass -shortest test1.mp4
其中, -shortest option instructs ffmpeg to trim the end of the audio track or video stream so that audio and video have the same final length.
参考资料: FFMPEG make Video Lyrics using JPG MP3 SRT File
filter_complex_script的使用
运行的命令如下所示, 需要注意的是, 我们这里后面有使用-map "[out_v]" output.mp4来指定我们的输出文件. 下面是一个简单的示范.
- ffmpeg -i funny_pets_01.mkv -filter_complex_script "remove_funny_pets_01.txt" -map "[out_v]" output.mp4
如果不指定上面的map, 就可能会出现下面的报错信息, 一定多加留意.
- Filter delogo has an unconnected output
但是实际上, 我们使用上面的方式生成视频之后, 会发现视频是没有声音的, 完整的命令如下所示:
- ffmpeg -i funny_pets_01.mkv -c:a copy -filter_complex_script "remove_funny_pets_01.txt" -map "[out_v]" -map 0:a output.mp4
这样就是一个filter_complex_script简单的介绍了.
视频的剪裁
有的时候, 我们需要从指定的时间开始, 到指定的时间结束, 对原始的视频进行剪裁, 于是可以通过下面的方式来进行完成.
下面是两种格式, 分别是以结束时间来看和以持续时间来看.
- 开始时间(start)和持续时间(duration)
- 开始时间(start)和结束时间(end)
- $ ffmpeg -ss [start] -i [input] -t [duration] -c copy [output]
- $ ffmpeg -ss [start] -i [input] -to [end] -c copy [output]
下面看一下实际的例子.
- ffmpeg -ss 00:01:50 -i funny_pets_01.mkv -t 10.5 -c copy output1.mp4
图片转gif
ffmpeg -f image2 -framerate 15 -i f:/eeeee/%d.jpg D:/c.gif
获取关键帧
ffmpeg -i "yourInputVideo.mp4" -vf select="eq(pict_type\,PICT_TYPE_I)" -vsync 2 -f image2 thumbnail_%02d.jpeg
视频转音频
- ffmpeg -i apple.mp4 -f mp3 -vn apple.mp3
- 参数解释:
- -i 表示input,即输入文件
- -f 表示format,即输出格式
- -vn表示vedio not,即输出不包含视频
其他参考资料
第一个说得很详细
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论