记录一下工作中常用的FFmpeg命令及其参数的解释,以例子的形式记录,某些参数可以组合使用。详细的用法请参考FFmpeg Documention。
查看可用编解码器等信息
FFmpeg由于版本的不同,可支持的编解码器的名称及功能可能不一样,遇到问题时可以查一下
- 可用的编解码器
ffmpeg –codecs
- 可用的解码器
ffmpeg –decoders
- 可用的编码器
ffmpeg –encoders
- 可用的过滤器
ffmpeg –filters
- 可用的视频格式
ffmpeg –formats
- 可用的协议
ffmpeg -protocals
基础用法
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy -y -f mp4 OUTPUT
-
-i
源输入,可以是文件,也可以是网络源地址,ffmpeg可以有多个输入源,如ffmpeg -i INPUT -i INPUT -i INPUT ……
-
-map
指明对某个文件的某个流进行操作,因为输入文件可以有多个,文件也可以有多个音视频流,-map 0
表示对第一个文件的所有流进行处理,-map 0:1
表示对第一个文件的第二个流进行处理,注意计数从0开始 -
-c:v
指明输出文件的视频编码,等同于-codec:v
,等同于-vcodec
,libx264
即H.264编码器,若不想对视频重新编码,即保持原视频的编码,则后面跟copy
-
-c:a
指明输出文件的音频编码,用法同上,等同于-codec:a
,等同于-acodec
-
-y
表示输出时如果相同文件名的文件已经存在,则直接覆盖,不用询问;相反-n
表示遇到此情况时立即退出 -
-f
指明输出文件的封装格式,如mp4
、flv
等
直接推流mp4文件
ffmpeg -re -i INPUT.mp4 -c copy -f flv rtmp://……
-
-c copy
表示音视频保持原有编码
本地文件重新编码并同时进行rtmp推流
ffmpeg -re -i INPUT -acodec aac -ac 2 -ar 44100 -ab 128k -vol 3000 -vcodec libx264 -vb 800k -s 360*640 -r 24 -b 928k -f flv rtmp://……
-
-re
表示以原生帧率读取数据。一般情况下ffmpeg会以尽可能快的速度读取数据,所以推流文件的话要加上此参数,如果是转推直播流的话,不用加此参数 -
-ac
设置音频编码声道数 -
-ar
设置音频编码采样率,单位kHz
,如44100, 24000, 16000等 -
-ab
设置音频码率,也可以写作-b:a
-
-vol
设置音频音量为原音频的多少倍,3000表示为原来的3000%,即30倍 -
-vb
设置视频码率,等同于-b:v
-
-s
设置视频分辨率,参数格式为w*h
或w×h
-
-r
设置帧率(fps) -
-b
设置总码率,分别设置了音视频码率后通常省略
对视频画面旋转90°
ffmpeg -i INPUT -acodec copy -vcodec libx264 -b 800k -vf transpose=1 OUTPUT
-
-vf
表示对视频应用Video Filter,可应用多个filter,中间用,
隔开并用""
包起来 -
transpose
Video Filter的一种,表示对视频画面进行旋转、翻转变换-
transpose=0
表示先逆时针旋转90°,再垂直翻转
-
L.R L.l
. . -> . .
l.r R.r
-
transpose=1
表示顺时针旋转90°
L.R l.L
. . -> . .
l.r r.R
-
transpose=2
表示逆时针旋转90°
L.R R.r
. . -> . .
l.r L.l
-
transpose=3
表示顺时针旋转90°,再垂直翻转
L.R r.R
. . -> . .
l.r l.L
修改视频分辨率并添加黑边
ffmpeg -i INPUT -vf "scale=640:360,pad=640:1138:0:389:black" -acodec copy -vcodec libx264 -s 640*1138 -b 800k OUTPUT
现将视频分辨率压缩到640×360,再给视频加上黑边,最终视频分辨率改为640×1138
-
scale
Video Filter的一种,设置视频分辨率,假设分辨率要设置成200×100,使用方法如下:
scale=200:100
等同于
scale=200x100
等同于
scale=w=200:h=100
当宽或高的值为-1时,表示维持原有宽或高
还可以使用一些常量定义,iw
、ih
、ow
、oh
,分别表示输入宽、输入高、输出宽、输出高,假设要缩小到原来的1/2,则可以用
scale=iw/2:ih/2
假设要宽度变成原来的2/3,高度和最后的宽度一样,则可以用
scale=2/3*iw:ow
-
pad
Video Filter的一种,设置视频边框,使用方法为
pad=w:h:x:y:color
w、h表示输出的宽、高,x、y表示原视频画面在最终输出画面中的左上角位置,color表示边框的颜色,默认是black,其余颜色请参考FFmpeg颜色定义
裁减视频画面
ffmpeg -i INPUT -vf crop=995:1080:540:0 -acodec copy -vcodec libx264 -f mp4 OUTPUT
-
crop=w:h:x:y
Video Filter的一种,表示裁切画面,从(x, y)的位置开始取w×h大小的画面
截取视频生成Gif
从视频25s处开始,截取10s长度的画面生成320x240大小、帧率为15fps的Gif
ffmpeg -ss 25 -t 10 -i INPUT -s 320x240 -f gif -r 15 OUTPUT.gif
-
-ss
表示从输入文件开始读取的时间位置,也就是开始截取的时间点,参数格式为HH:MM:SS.mmm
,小时和分钟可以省略,截取的时间点不是完全精准的 -
-t
表示截取的时间长度,即duration,也可以使用-to
,表示截取的截止时间点,配合-ss
来定义截取的长度 -
-r
表示输出帧率
截取视频内任意时间点的一帧图像保存为JPEG文件
ffmpeg -ss 16.1 -i INPUT -s 320x240 -vframes 1 -f image2 OUTPUT.jpeg
-
-vframes
设置要输出的帧的个数,等同于-frames:v
-
-f image2
表示封装格式为image2类型,image2
为FFmpeg中的图片封装格式名称
抽取帧序列,再生成Gif
从源视频中每秒钟抽取5帧图像,保存为一系列JPEG文件
ffmpeg -ss 25 -t 10 -i INPUT -r 5 -s 320x240 -f image2 D:\result-%03d.jpeg
-
D:\result-%03d.jpeg
自动按序号命名输出
将这一系列JPEG图像合成为帧率5 fps的GIF文件
ffmpeg -f image2 -framerate 5 -i D:\result-%03d.jpeg OUTPUT.gif
-
-framerate
表示每秒读取多少帧,与-r
好像不同,读取图片类型时最好用这个
生成高质量Gif
上述方法生成的Gif画质比较一般,下面的方法可生成更高质量的Gif,windows平台下将下面代码存为bat文件执行即可
@echo on
set start_time=00:00:10
set duration=5
set palette="D:\tmp\palette.png"
set filters="fps=15,scale=270:-1:flags=lanczos"
ffmpeg -v warning -ss %start_time% -t %duration% -i INPUT -vf "%filters%,palettegen" -y %palette%
ffmpeg -v warning -ss %start_time% -t %duration% -i INPUT -i %palette% -lavfi "%filters% [x]; [x][1:v] paletteuse" -y OUTPUT.gif
pause
中间要生成一个调色板文件D:\tmp\palette.png
,再利用此调色板生成Gif,具体原理请参阅使用FFmpeg处理高质量GIF图片
剪切视频
ffmpeg -ss 00:00:20 -t 00:00:30 -i INPUT -c copy OUTPUT
精确剪切mp4视频
ffmpeg -i input.mp4 -qscale 0 -intra temp.mp4
ffmpeg -ss 00:00:30 -vsync 0 -t 00:00:30 -i temp.mp4 -acodec libvo_aacenc -vcodec libx264 output.mp4
-
-qscale
Use fixed quality scale (VBR),即使用动态码率,值越小质量越高 -
-intra
表示使用帧内编码 -
-vsync
视频同步方法,0表示:Each frame is passed with its timestamp from the demuxer to the muxer.
将一张图片转成任意时长的视频
ffmpeg -loop 1 -i input.png -vcodec libx264 -vb 500k -s 480*640 -r 15 -t 10 ouput.mp4