使用FFmpeg为视频添加字幕

编入视频流(内嵌字幕|硬字幕)

要在视频流上面加上字幕,就得使用一个叫做 subtitles 的滤镜,要使用这个滤镜,在命令中写上 -vf subtitles=字幕文件名 ,还是要注意,如果文件名包含空格或其他特殊字符,得用半角引号包起来: -vf subtitles="字幕 文件名"。因为这个操作改写了视频流,所以视频流必须得重新编码。
使用 subtitles 滤镜为视频添加字幕(将字幕合成到视频流中,输出文件中不含字幕流):

1
ffmpeg -i input.mkv -vf subtitles=subtitles.srt output.mkv

input.mkv 中的字幕(默认)嵌入到 output.mp4 文件

1
ffmpeg -i input.mkv -vf subtitles=input.mkv output.mp4

input.mkv 中的字幕(第二个)嵌入到 output.mp4 文件

1
ffmpeg -i input.mkv -vf subtitles=input.mkv:si=1 output.mp4

关于 subtitles 滤镜的详细用法:http://ffmpeg.org/ffmpeg-all.html#subtitles-1
还可以使用 ass 滤镜,用法和 subtitles 滤镜几乎一样,但它只用于 ASS (Ad­vanced Sub­sta­tion Al­pha) 字幕文件,可以先进行字幕转换,再使用它:

1
2
ffmpeg -i subtitles.srt subtitles.ass
ffmpeg -i input.mkv -vf ass=subtitles.ass output.mp4

关于 ass 滤镜的说明:http://ffmpeg.org/ffmpeg-all.html#ass
在实际使用中发现 asssubtitles 最终效果并无区别,但 ass 只能使用 ASS 字幕文件,不可以直接使用容器中的字幕流,所以直接使用 subtitles 即可,省去了手动提取和转换的过程。

作为字幕流(内封字幕|软字幕)作为字幕流(内封字幕|软字幕)

将字幕封装到容器中,就是所谓的字幕流,和视频流、音频流同等地位。值得说明的是,并非所有的容器都支持字幕流,先进的 MKV 是支持的,MP4 目前我只知道支持苹果的 MOV text。
MKV 封装工具:MKVToolNix
MKV 提取工具:gMKVExtractGUIMKVExtractGUI
MKVEx­tract­GUI 无法使用,原因未知

使用图形化工具更方便。

将字幕封装到容器中将字幕封装到容器中

1
ffmpeg -i input.mkv -i subtitles.srt -c copy output.mkv

从容器中提取字幕流

1
ffmpeg -i input.mkv output.srt

例子中生成的是 srt 格式的,可以任意生成所需的格式,改一下扩展名即可。

参考:

使用 FFmpeg 为视频添加字幕