ffmpeg用法

简介

是一个非常快的视频和音频转换器,它可以抓取音频/视频源。它还可以在任意采样率之间转换,并利用高质量多相滤波器实时调整视频大小。

组成

FFmpeg项目由以下几部分组成:

  • FFmpeg视频文件转换命令行工具,也支持经过实时电视卡抓取和编码成视频文件;
  • ffserver基于HTTP、RTSP用于实时广播的多媒体服务器.也支持时间平移;
  • ffplay用 SDL和FFmpeg库开发的一个简单的媒体播放器;
  • libavcodec一个包含了所有FFmpeg音视频编解码器的库。为了保证最优性能和高可复用性,大多数编解码器从头开发的;
  • libavformat一个包含了所有的普通音视格式的解析器和产生器的库。

举例

MKV转MP4,音频部分只提取第2路音轨

1
ffmpeg -i input.mkv -map 0:v -vcodec copy -map 0:a:1 -acodec copy -strict -2 output.mp4
  • 0:v:代表提取所有视频流
  • 0:a:1:代表如果有多路音轨,只提取第2路音轨
  • -strict -2:使用ffmpeg自带的aac音频编码

MKV转MP4,转换多路ac3音轨

1
ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:2 -vcodec copy -acodec ac3 -disposition:a:0 default -y output.mp4
  • -disposition:a:0 default:默认第一音轨

视频切割

1
2
3
4
5
6
7
8
# 剪切的同时,格式不变,音视频参数不变:
ffmpeg -y -i input.mp4 -ss 00:00:00.0 -t 00:01:00.0 -acodec copy -vcodec copy -async 1 output.mp4
# 剪切的同时,音视频参数不变,只转换格式:
ffmpeg -y -i input.mp4 -ss 00:00:00.0 -t 00:01:00.0 -acodec copy -vcodec copy -async 1 output.flv
# 剪切的同时,格式不变,只转换音视频参数:
ffmpeg -y -i input.mp4 -ss 00:00:00.0 -t 00:01:00.0 -ab 56k -ar 44100 -b:v 2200k -r 29.97 -s 640*360 output.mp4
# 剪切的同时,既转换格式又转换音视频参数:
ffmpeg -y -i input.mp4 -ss 00:00:00.0 -t 00:01:00.0 -ab 56k -ar 44100 -b:v 2200k -r 29.97 -s 640*360 output.flv
  • -y:表示覆盖输出文件
  • -ab:设置音频码率
  • -ar:设置音频采样率
  • -b:v:设置视频比特率为2200千比特/秒
  • -r:设置帧频 缺省25
  • -s:设置帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用:Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
  • -ss:表示起始时间,格式为“小时:分钟:秒”
  • -t:表示时长,格式为“小时:分钟:秒”

视频增加黑边

使用FFmpeg给视频增加黑边需要用到 pad 这个滤镜,具体用法如下:
-vf pad=1280:720:0:93:black
按照从左到右的顺序依次为:
​“宽”、“高”、“X坐标”和“Y坐标”,宽和高指的是输入视频尺寸(包含加黑边的尺寸),XY指的是视频所在位置。

比如一个输入视频尺寸是1280x534的源,想要加上黑边变成1280x720,那么用上边的语法可以实现,93是这样得来的,(720-534)/2。

如果视频原始1920x800的话,完整的语法应该是:
-vf ‘scale=1280:534,pad=1280:720:0:93:black’

先将视频缩小到1280x534,然后在加入黑边变成1280x720,将1280x534的视频放置在x=0,y=93的地方,
​FFmpeg会自动在上下增加93像素的黑边。
注:black可以不写,默认是黑色

字幕

字幕流跟其他媒体流一样,有各种编码,常见的编码有SubRip(作为独立文件时后缀名为.srt)和ASS(作为独立文件时后缀名为.ass)

因为字幕流也是媒体流,也有各种编码,所以,我们可以通过-scodec或-c:s选项来指定字幕流的编码。

例:提出字幕流
ffmpeg -i output.mkv -an -vn -scodec copy sub3.ass

例:转换字幕格式
ffmpeg -i subtitle.srt subtitle.ass

例:而将字幕流转换为 ass 编码:
ffmpeg -i Tor_Animation_en.mp4 -i Tor_animation.zh-CN.srt -c:v copy -c:a copy -c:s ass Tor_Animation_subtitled.mkv

例:将srt字幕编入视频流
ffmpeg -i Tor_Animation_en.mp4 -vf subtitles=Tor_animation.zh-CN.srt -c:a copy Tor_Animation_subtitled.mp4

例:将ass字幕编入视频流
ffmpeg -i Tor_Animation_en.mp4 -vf "ass=subtitle.ass" -c:a copy Tor_Animation_subtitled.mp4

字幕参数设置

srt字幕流

1
2
3
4
5
6
7
8
9
10
11
12
$ ffmpeg -i **.mp4 -vf "subtitles=**.src:force_style='FontSize=20,Alignment=6'" output.mp4
#Alignment参数
1: Bottom left
2: Bottom center
3: Bottom right
5: Top left
6: Top center
7: Top right
9: Middle left
10: Middle center
11: Middle right

ass字幕流

最新版本的 ffmpeg 使用 ASS中的V4+ Styles

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
"[V4+ Styles]\r\n"
/* ASSv4 header */
"Format: Name, "
"Fontname, Fontsize, "
"PrimaryColour, SecondaryColour, OutlineColour, BackColour, "
"Bold, Italic, Underline, StrikeOut, "
"ScaleX, ScaleY, "
"Spacing, Angle, "
"BorderStyle, Outline, Shadow, "
"Alignment, MarginL, MarginR, MarginV, "
"Encoding\r\n"

01.Name 风格(Style)的名称. 区分大小写. 不能包含逗号.
02.Fontname 使用的字体名称, 区分大小写.
03.Fontsize 字体的字号
04.PrimaryColour 设置主要颜色, 为蓝-绿-红三色的十六进制代码相排列, BBGGRR. 为字幕填充颜色
05.SecondaryColour 设置次要颜色, 为蓝-绿-红三色的十六进制代码相排列, BBGGRR. 在卡拉OK效果中由次要颜色变为主要颜色.
06.OutlineColour 设置轮廓颜色, 为蓝-绿-红三色的十六进制代码相排列, BBGGRR.
07.BackColour 设置阴影颜色, 为蓝-绿-红三色的十六进制代码相排列, BBGGRR. ASS的这些字段还包含了alpha通道信息. (AABBGGRR), 注ASS的颜色代码要在前面加上&H
08.Bold -1为粗体, 0为常规
09.Italic -1为斜体, 0为常规
10.Underline [-1 或者 0] 下划线
11.Strikeout [-1 或者 0] 中划线/删除线
12.ScaleX 修改文字的宽度. 为百分数
13.ScaleY 修改文字的高度. 为百分数
14.Spacing 文字间的额外间隙. 为像素数
15.Angle 按Z轴进行旋转的度数, 原点由alignment进行了定义. 可以为小数
16.BorderStyle 1=边框+阴影, 3=纯色背景. 当值为3时, 文字下方为轮廓颜色的背景, 最下方为阴影颜色背景.
17.Outline 当BorderStyle为1时, 该值定义文字轮廓宽度, 为像素数, 常见有0, 1, 2, 3, 4.
18.Shadow 当BorderStyle为1时, 该值定义阴影的深度, 为像素数, 常见有0, 1, 2, 3, 4.
19.Alignment 定义字幕的位置. 字幕在下方时, 1=左对齐, 2=居中, 3=右对齐. 1, 2, 3加上4后字幕出现在屏幕上方. 1, 2, 3加上8后字幕出现在屏幕中间. 例: 11=屏幕中间右对齐. Alignment对于ASS字幕而言, 字幕的位置与小键盘数字对应的位置相同.
20.MarginL 字幕可出现区域与左边缘的距离, 为像素数
21.MarginR 字幕可出现区域与右边缘的距离, 为像素数
22.MarginV 垂直距离