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

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

使用 subtitles 滤镜为视频添加字幕(将字幕合成到视频流中,输出文件中不含字幕流):

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

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

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

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

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

关于 subtitles 滤镜的详细用法:http://ffmpeg.org/ffmpeg-all.html#subtitles-1

还可以使用 ass 滤镜,用法和 subtitles 滤镜几乎一样,但它只用于 ASS(Advanced Substation Alpha)字幕文件,可以先进行字幕转换,再使用它:

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

MKVExtractGUI 无法使用,原因未知

使用图形化工具更方便。以下都是废话

将字幕封装到容器中

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

从容器中提取字幕流

ffmpeg -i input.mkv output.srt

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

参考:

FFmpeg 官方 Wiki:HowToBurnSubtitlesIntoVideo

Windows下使用ffmpeg为视频添加字幕

使用FFmpeg将字幕文件集成到视频文件

如何使用 FFmpeg 进行视频转码:字幕