Contents

音视频操作,几乎绕不开ffmpeg,因为市面上绝大多数音视频播放软件、转码软件,内核都是它。

它非常的强大,轻松几条命令就可以顺利完成你想做的工作

我来汇总一些经常使用的命令

首先在cmd窗口进入到ffmpeg目录里面

最简单的视频格式转换

1
2
3
4
5
6
7
8
9
10
11
12
13
ffmpeg -i D:\Media\IMG_0873.MOV -c copy  D:\Media\output.avi

意思是,把D:\Media目录下的源文件IMG_0873.MOV(视频:h.264,音频:aac)转换成output.avi(编码格式自动选择为:视频mpeg4,音频mp3),目标文件仍然保存到D:\Media目录下。

问题来了:我想自己指定编码格式,怎么办呢?一种方法是,通过目标文件的扩展名(.flv、.mpg、.mp4、.wmv等)来控制,比如:

ffmpeg -i D:\Media\IMG_0873.MOV D:\Media\output2.flv 只需要修改格式名称就OK,比如这个命令就转为了flv格式

如果是整个文件夹中的所有flv文件需要批量转成mp4,那么使用以下命令:

for %i in (*.flv) do ffmpeg -i "%i" -c copy "%~ni.mp4"

注:不要更改以上的任何一个字符,新生成的mp4文件会自动拷贝原文件名。

我发现用手机拍的视频中,有些是颠倒的,我想让它顺时针旋转90度。这时候,可以使用-vf参数加入一个过滤器,如下:

1
2
3
ffmpeg -i D:\Media\IMG_0873.MOV -vf "rotate=90*PI/180" D:\Media\output3.avi

注:如果想逆时针旋转90度,90前面加个负号就可以了。

视频截取

1
2
3
ffmpeg -ss 2 -t 10 -i D:\Media\IMG_0873.MOV D:\Media\output4.avi

注:这种情况下,-ss和-t参数必须放在-i前面,表示是限定后面跟着的输入文件的。

按照时长截取

1
ffmpeg -i demo.mp3 -ss 00:00:00 -t 00:00:05 -acodec copy out.mp3

按照时长截取,替换到视频中的音频

1
ffmpeg -ss 00:00:00 -t 00:00:05 -i demo.mp4  -ss 00:00:00 -t 00:00:05  -i demo.mp3  -c:v copy -c:a aac -strict experimental -map 0:v:0 -map 1:a:0  C:\Users\Administrator\Desktop\out.mp4

用手机拍的视频有时候背景噪音比较大。怎么把噪音去掉,换成一段美妙的音乐呢?

1
2
3
4
5
6
7
8
9
10
第一步:把源文件里的音频去掉,生成一个临时文件tmp.mov
ffmpeg -i D:\Media\IMG_0873.MOV -vcodec copy -an D:\Media\tmp.mov

注:-vcodeccopy的意思是对源视频不解码,直接拷贝到目标文件;-an的意思是将源文件里的音频丢弃。

第二步:把这个无声的视频文件(tmp.mov)与一个音乐文件(music.mp3)合成,最终生成output.mov

ffmpeg -i D:\Media\tmp.mov -ss 30 -t 52 -i D:\Media\music.mp3 -vcodec copy D:\Media\output5.avi

为了保证良好的合成效果,音乐时长必须匹配视频时长。这里我们事先知道视频时长为52秒,于是截取music.mp3文件的第30秒往后的52秒与视频合成。另外,为了保证音频时长截取的准确性,我们这里没有使用-acodec copy,而是让音频重新转码。

视频画中画功能(类似微信视频)

1
ffmpeg -i out1.mp4  -i out2.mp4  -filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[ckout];[0:v][ckout]overlay=x=W-w-10:y=0[out]" -map "[out]" -movflags faststart  out.mp4

4个视频同时播放,左上角右上角左下角右下角

1
ffmpeg -i out1.mp4 -i out2.mp4 -i out3.mp4 -i out4.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[a];[a][1:v]overlay=w[b];[b][2:v]overlay=0:h[c];[c][3:v]overlay=w:h" out.mp4

4个视频同时播放,左上角右上角左下角右下角,按照时间剪切

1
ffmpeg -ss 00:00:00 -t 00:00:05  -i out1.mp4 -ss 00:00:00 -t 00:00:05  -i out2.mp4 -ss 00:00:00 -t 00:00:05  -i out3.mp4 -ss 00:00:00 -t 00:00:05 -i out4.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[a];[a][1:v]overlay=w[b];[b][2:v]overlay=0:h[c];[c][3:v]overlay=w:h" out.mp4

合成 gif

1
2
3
4
5
把视频的前 30 帧转换成一个 Gif
ffmpeg -i input_video.mp4 -vframes 30 -y -f gif output.gif

将视频转成 gif
ffmpeg -ss 00:00:00.000 -i input.mp4 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif

添加水印

1
ffmpeg -i input.mp4 -i picture.png -filter_complex overlay="(main_w/2)-(overlay_w/2):(main_h/2)-(overlay_h)/2" output.mp4

三合一左中右合成

1
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex "[0:v]pad=iw*3:ih*1[a];[a][1:v]overlay=w[b];[b][2:v]overlay=w*2" out.mp4
Contents