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

三合一左中右依次播放,分辨率为1280*720

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ffmpeg -i 1.mp4 -s 426:720  1.mp4  //调整视频大小 426*720

截取视频第一帧
ffmpeg -i 1.mp4 -r 1 -vframes 1 -f image2 1.jpg

//视频图片合并
ffmpeg -i 1.mp4 -i 2.jpg -i 3.jpg -filter_complex "[0:v]pad=iw*3:ih*1[a];[a][1:v]overlay=w[b];[b][2:v]overlay=w*2" 4.mp4

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

ffmpeg -i 1.jpg -i 2.jpg -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" 6.mp4


//先转换格式
ffmpeg -i 4.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input1.ts
ffmpeg -i 5.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input2.ts
ffmpeg -i 6.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input3.ts

//最后进行链接播放
ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy -bsf:a aac_adtstoasc -movflags +faststart output.mp4

调整视频速率

1
2
3
4
原理:调整视频速率的原理为:修改视频的pts,dts 此过程由于不用进行解码编码,所以费时很少
ffmpeg -i input.mkv -an -filter:v "setpts=0.5*PTS" output.mkv
注意:调整速度倍率范围[0.25, 4] 如果只调整视频的话最好把音频禁掉 对视频进行加速时,如果不想丢帧,可以用-r 参数指定输出视频FPS
ffmpeg -i input.mkv -an -r 60 -filter:v "setpts=2.0*PTS" output.mkv

调整音频速率

1
2
3
4
原理:简单的方法是调整音频采样率,但是这种方法会改变音色, 一般采用通过对原音进行冲采样,差值等方法。
ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv
注意:倍率调整范围为[0.5, 2.0] 如果需要调整4倍可采用以下方法:
ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv

音视频同时调整速度

1
ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv

Contents