欢迎诸位来阅读在下的博文~
在这里,在下会不定期发表一些浅薄的知识和经验,望诸位能与在下多多交流,共同努力
一、常见命令
ffmpeg -i input.mp4 -c copy output.mp4
- 解释:-i 后面接输入文件的路径位置,-c 是所有流的编解码器,-c copy代表所有流的编解码器从输入文件复制过去。
ffmpeg -i input.mp4 -ss 00:00:07 -to 00:00:15 -c copy output.mp4
- 解释: -ss 和 -to 后面接时间戳或者时间码,代表开始和结束。例中代表第7秒开始到第15秒结束,也就是截取一段音视频。
ffmpeg -i vinput.mp4 -i ainput.aac -vcodec copy -acodec aac output.mp4
- 注释:将一个视频文件和一个音频文件合在一起,其中 -vcodec 代表视频编码,-acodec 代表音频解码,后面接copy代表从输入文件中复制编解码器,也可以使用名字指定一个。
- -vcodec 等价于 -c:v , -acodec 等价于 -c:a 。
- 还有类似的:-c:s 字幕流,-c:d 数据流。
ffmpeg -i input.mp4 -c copy -an output.mp4
- 注释:剥离音频流。-an代表不处理音频,还有 -vn 代表不处理视频。
ffmpeg -f concat -i input_list.txt -c copy output.mp4
//input_list.txt内容如下:
file 'input1.mp4'
file 'input2.mp4'
- 注释:-f 代表指定输入或输出文件的格式,concat代表融合,这里用来修饰输入文件,表示输入文件里面有多个文件需要融合。
ffmpeg -f h264 -i input.h264 -c:v copy output.mp4
- 注释:指定输入文件是H.264格式。
ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 output.yuv
ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 output.jpg
ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 output.png
- 注释:截取输入视频的某一帧,输出为相应格式的图片。
ffmpeg -i input.mp4 -pix_fmt yuvj420p -vframes 1 output.jpg
- 注释:-pix_fmt 用于转换输入文件的像素格式,以完成色彩空间的装换。
ffmpeg -i input.mp4 -vf "select='gte(n\,10)*lte(n\,100)',setpts=PTS-STARTPTS"
-vsync vfr output.gif
- 注释:-vf 代表指定视频流滤镜,后面接滤镜描述字符串。例子中描述字符串的意思是从第10帧到第100帧截取视频,并且修改好时间戳。-vsync vfr 使用可变帧率确保帧不会重复或丢失。命令的结果是输出一张动态图。
- -vf 指定视频流滤镜 ; -af 指定音频流滤镜; -filter_complex 指定多流滤镜
二、实战
给两张图片,一张是.jpg图片,一张是.png图片。要求把两张图片融合变成视频,每张图片播放3秒。
思路一:先将两张图片分别编码成视频,然后再将两个视频融合。
ffmpeg -f image2 -loop 1 -i input1.jpg -c:v h264 -pix_fmt yuv420p -r 25 -t 3 output1.mp4
ffmpeg -f image2 -loop 1 -i input2.png -c:v h264 -pix_fmt yuv420p -r 25 -t 3 output2.mp4
ffmpeg -f concat -i image_list.txt -c copy ff_merge_image.mp4
// image_list.txt:
file 'output1.mp4'
file 'output2.mp4'
- 注释:-loop 表示循环处理一个源文件,-r 25 表示输出视频每秒25帧,-t 3 表示输出视频时长3秒。
思路二:使用多流滤镜,对两张图片一块处理
ffmpeg -loop 1 -t 3 -i input1.jpg -loop 1 -t 3 -i input2.png
-filter_complex "[0:v][1:v]concat=n=2:v=1:a=0" -y output.mp4
- 注释:[0:v] 是指将输入文件1转换成下标为0的视频流,[1:v] 同理,后面 concat指使用concat滤镜,滤镜后面使用 = 承接后来的滤镜参数,比如例子中n=2是指一共两路流。多个滤镜参数之间使用:隔开,例子中v=1是指输出为一路视频流,a=0是指没有音频流。-y 这个参数表示在输出文件已经存在时覆盖它,而不提示用户确认。
三、总结
诸位可以发现,ffmpeg的命令非常灵活多变,使用不同的思路也可以得出同一结果,但是大体的框架如下:
ffmpeg [输入文件的参数] -i [输入文件的位置] //输入处理
(-vf/af/filter_complex [滤镜描述字符串]) //中间滤镜加工(可选)
[输出文件的参数] [输出文件的位置] //输出处理
在变中把握不变,是一切学习的真谛,或许有更好的框架,欢迎各位在评论区留言,在下不胜感激~
至此,结束~
望诸位不忘三连支持一下~