下载
下载地址:https://ffmpeg.org/download.html
https://www.gyan.dev/ffmpeg/builds/#release-builds
然后按照下图点击,找到Release部分下载一个即可。
安装
所谓安装就是解压并配置“path”环境变量
将安装包解压至任意目录,比如我这里是D:\Program\ffmpeg-5.0.1-full_build
按照以下顺序点击:“此电脑(右键)——属性——高级系统设置——环境变量”
然后把ffmpeg.exe所在路径,即D:\Program\ffmpeg-5.0.1-full_build\bin添加到Path中,之后一路确定即可。
验证安装:
打开cmd,输入ffmpeg,出现正常的程序说明,就表明安装成功了
使用
官方使用说明:https://ffmpeg.org/ffmpeg.html
查看视频信息
ffmpeg -i input.mp4
显示如下:
从上面可以得到如下信息:
视频编码:h264
色彩格式:yuvj420p
色域范围:bt709
分辨率:1080x1920(width x height)
视频码率:14309 kbps
帧率:30 fps
音频编码:aac
音频码率:115 kbps
音频采样率:44100 Hz
最简单用法
ffmpeg -i input.mp4 -y output.avi
1
-i:指定输入
-y:输出如果重名直接覆盖
以拷贝的形式转格式,不重新编码,所以速度很快
ffmpeg -i input.mp4 -vcodec copy -acodec copy output.avi
1
-vcodec copy:拷贝视频
-acodec copy:拷贝音频
改变帧率
ffmpeg -i input.mp4 -r 10 -y output.mp4
1
-r 10:将输出帧率改为10 fps
改变编码
比如使用h265编码
ffmpeg -i input.mp4 -vcodec libx265 -y output.mp4
1
之后再查看视频信息可以看到(hevc = h265):
Stream #0:00x1: Video: hevc (Main) (hev1 / 0x31766568)
控制转码质量
ffmpeg -i input.mp4 -crf 35 -y output.mp4
1
或
ffmpeg -i input.mp4 -qp 30 -y output.mp4
1
QP(Quantization Parameters)和CRF(Constant Rate Factor)都是数值越小画质越好,数值越大画质越差。
QP在整个编码中使用相同的量化参数。
而CRF则具备自适应调节QP的能力,在画面运动比较强的时候使用高QP,在画面运动比较小的时候使用低QP。因为当画面运动比较强的时候,人的注意力常常不会被画质所吸引,所以QP大一些,也就是说画质差一些,不会造成太大的主观体验上的影响;反之当画面运动很小时,人的注意力有充分的空闲去注意画质问题,此时需要QP小一些,画质好一些,以避免带来糟糕的主观体验。另外与CRF名字呼应的一点,画面运动强时,视频片段倾向于有比较高的码率,使用大的QP有助于降低码率;画面运动小时,视频片段倾向于有比较低的码率,使用小QP可以提升一些码率,所以整体而言CRF会起到稳定码率的作用。
一般来说,使用CRF的情况多于QP,如果不是对QP有特定需求,那么首选CRF模式。在几乎相同的视觉效果的情况下,CRF一般比QP能节省一些码率。
关于CRF的取值范围和默认值可参考如下:
QP在libx264情况下取值范围也是0-51。
控制输出码率
ffmpeg -i input.mp4 -b:v 5M -y c.mp4
1
其中关键性的参数是-b:v 5M,指输出码率限制在5M bps。
但请注意,这个模式只是控制视频最终的码率,并不意味着视频中码率一直保持固定值,事实上在这个模式下,视频码率变化反而会有一些不受控,有时(特别是每个转场后clip的初始一些帧)会特别低。
时序裁剪
ffmpeg -i input.mp4 -ss 0:0:5 -t 0:0:4 -y output.mp4
1
-ss:指定截取的起始时间点,格式是hh:mm:ss
-t:截取的持续时间(duration),格式也是hh:mm:ss;或者简单写一个数字,单位是秒。
空间裁剪
ffmpeg -i input.mp4 -vf crop=500:1000:0:0 -y output.mp4
1
-vf 表示设置video相关的filters
crop后面的参数格式是width:height: x:y。width和height是输出视频的宽高;x,y是输出视频的左上顶点的坐标。
旋转视频
ffmpeg -i input.mp4 -vf rotate=PI/4 -y output.mp4
1
rotate:以视频中心为旋转点,顺时针旋转视频,视频原本的宽高保持不变,所以旋转后视频会有内容缺失以及黑边。
缩放视频
ffmpeg -i input.mp4 -vf scale=360:540 -y output.mp4
ffmpeg -i input.mp4 -vf scale=360:-1-y output.mp4
1
2
scale:格式是 width:height,其中一项可以设置成-1,此时会根据另一条边的比例自动计算。
抽帧
ffmpeg -i input.mp4 .\temp\frame_%3d.png
1
帧号从1开始计数,路径必须已经存在。
ffmpeg -i input.mp4 -r 1 .\temp\frame_%3d.png
1
-r 1:每秒抽取1帧,帧号仍然从1开始连续计数。(第一帧看起来似乎有点重复)
ffmpeg -i input.mp4 -vframes 10 .\temp\frame_%3d.png
1
-vframes 10:指定抽帧数量,总共抽10帧。
ffmpeg -i input.mp4 -vf select=eq(pict_type\,I) -vsync vfr .\temp2\frame_%3d.png
ffmpeg -i input.mp4 -vf select=eq(pict_type\,P) -vsync vfr .\temp2\frame_%3d.png
ffmpeg -i input.mp4 -vf select=eq(pict_type\,B) -vsync vfr .\temp2\frame_%3d.png
1
2
3
提取IPB帧,其中-vsync vfr选项可以删除掉重复帧,不然提取出来的结果有大量重复图片。
但还是注意,这种情况下ffmpeg抽取的帧仍然是从1开始连续计数,所以就无法知道单独抽取出来的IPB帧真实的帧号序列。可以使用下面命令打印帧类型,然后手动重命名。
ffprobe -i input.mp4 -select_streams v -show_entries frame=pict_type
1
上述命令打印结果如下,想要把帧号对应起来,需要比较多的手动操作:
[FRAME]
pict_type=I
[SIDE_DATA]
[/SIDE_DATA]
[/FRAME]
[FRAME]
pict_type=B
[/FRAME]
[FRAME]
pict_type=P
[/FRAME]
[FRAME]
pict_type=B
[/FRAME]
IPB帧含义简介:
I帧:表示关键帧,是最完整的帧画面,一般视频封面都选择I帧。
P帧:单预测帧,利用之前的I帧或P帧,采用运动预测的方式进行帧间预测编码。
B帧:双向预测帧,利用双向帧进行预测编码。
单独提取视频
ffmpeg -i input.mp4 -an -y video.mp4
ffmpeg -i input.mp4 -an -vcodec copy -y video.mp4
1
2
-an:这个选项用于去掉音频(disable audio),剩下的就是单独视频了。
为了使提取的视频与源视频一样,可加上-vcodec copy选项
单独提取音频
ffmpeg -i input.mp4 -vn -y audio.mp3
ffmpeg -i input.mp4 -vn -acodec copy -y audio.aac
1
2
-vn:这个选项用于去掉视频(disable video),剩下的就是单独音频。
另注意-acodec copy选项只能用于.aac格式,不能用于mp3格式。
合并音视频
ffmpeg -i video.mp4 -i audio.mp3 -y output.mp4
ffmpeg -i video.mp4 -i audio.mp3 -vcodec copy -acodec copy -y output.mp4
1
2
设置两个输入一个输出即可,两个输入分别是视频和音频。如果不想重新对输入做编码,那么使用-vcodec copy -acodec copy选项。
最终输出视频的长度是两个文件较长者,比如mp3长于mp4,那么mp4播放结束后固定在最后一帧,继续播mp3
ffmpeg -i video.mp4 -i audio.mp3 -shortest -y output.mp4
1
-shortest:以音频和视频文件中较短的作为输出长度。
替换源视频中的音频
ffmpeg -i input.mp4 -i audio.mp3 -map 0:v:0 -map 1:a:0 -y output.mp4
1
-map 0:v:0将第一个(索引0)视频流从输入映射到输出中的第一个(索引0)视频流。
-map 1:a:0将第二个(索引1)音频流从输入映射到输出中的第一个(索引0)音频流。
合并多段视频
mpeg格式文件可以直接合并,但是不通用。
一般可以选择将视频转化为 ts 流,然后再合并。
ffmpeg -i input.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i input2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts" -vcodec copy -acodec copy -absf aac_adtstoasc -y output.mp4
1
2
3
图片合成视频
ffmpeg -i .\temp\frame_%3d.png -y output.mp4
1
上面是最简单的命令,默认帧率是25,一般需要设置个帧率。
ffmpeg -r 30 -i .\temp\frame_%3d.png -y output.mp4
1
设置帧率的话,把-r 30放在-i xxx前面或者后面代表的含义不一样:
-r放在前面的话既指定图片输入的帧率,也指定视频输出的帧率。
-r放在后面的话仅指定视频输出的帧率。
ffmpeg -r 30 -i .\temp\frame_%3d.png -r 60 -y output.mp4
1
比如,如果使用300张图片,使用上述命令合成视频,那么图片以30fps送入,视频以60fps输出,所以最后结果是60fps * 10s的视频,视频包含600帧。至于多出来的帧是重复帧还是插帧得来的,不是太清楚。
ffmpeg -r 30 -i .\temp\frame_%3d.png -i audio.aac -y output.mp4
1
可以进一步使用上面命令把音频也加上。
视频更换预览封面
ffmpeg -i input.mp4 -i cover.png -map 0 -map 1 -c copy -disposition:v:1 attached_pic -y output.mp4
1
用上面命令可以把视频的预览封面改成cover.png。
图片+声音,生成视频
ffmpeg -loop 1 -i image.png -i audio.aac -shortest -y output.mp4
1
-loop 1表示图片无限循环,-shortest表示视频持续到音频结束。
转gif
ffmpeg -i input.mp4 -y output.gif
ffmpeg -i input.mp4 -s 540:960 -y output.gif
1
2
直接改变后缀就可以实现输出gif的目的,-s 540:960可以改输出分辨率,格式是W:H或者WxH
改变色彩格式(pix_fmt)
ffmpeg -i input.mp4 -pix_fmt yuv422p -y output.mp4
1
有时候Windows下合成的视频放到Mac上不能播放,可能就是受色彩格式影响,改变一下色彩格式就能解决。
查看每种编码器支持的色彩格式,可以使用如下命令:
ffmpeg -h encoder=libx264
1
打印的信息有点长,从信息中可以扒拉出libx264支持的色彩格式:
Supported pixel formats: yuv420p yuvj420p yuv422p yuvj422p yuv444p yuvj444p nv12 nv16 nv21 yuv420p10le yuv422p10le yuv444p10le nv20le gray gray10le
libx265:
Supported pixel formats: yuv420p yuvj420p yuv422p yuvj422p yuv444p yuvj444p gbrp yuv420p10le yuv422p10le yuv444p10le gbrp10le yuv420p12le yuv422p12le yuv444p12le gbrp12le gray gray10le gray12le