FFmpeg常用命令

记录一下工作中常用的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,等同于-vcodeclibx264即H.264编码器,若不想对视频重新编码,即保持原视频的编码,则后面跟copy
  • -c:a 指明输出文件的音频编码,用法同上,等同于-codec:a,等同于-acodec
  • -y 表示输出时如果相同文件名的文件已经存在,则直接覆盖,不用询问;相反-n表示遇到此情况时立即退出
  • -f 指明输出文件的封装格式,如mp4flv

直接推流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*hw×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时,表示维持原有宽或高
还可以使用一些常量定义,iwihowoh,分别表示输入宽、输入高、输出宽、输出高,假设要缩小到原来的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

你可能感兴趣的:(FFmpeg常用命令)