要在视频流上面加上字幕,就得使用一个叫做 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
在实际使用中发现 ass 和 subtitles 最终效果并无区别,但 ass 只能使用 ASS 字幕文件,不可以直接使用容器中的字幕流,所以直接使用 subtitles 即可,省去了手动提取和转换的过程。
将字幕封装到容器中,就是所谓的字幕流,和视频流、音频流同等地位。值得说明的是,并非所有的容器都支持字幕流,先进的 MKV 是支持的,MP4 目前我只知道支持苹果的 MOV text。
MKV 封装工具:MKVToolNix
MKV 提取工具:gMKVExtractGUI、MKVExtractGUI
MKVExtractGUI 无法使用,原因未知
使用图形化工具更方便。以下都是废话
ffmpeg -i input.mkv -i subtitles.srt -c copy output.mkv
ffmpeg -i input.mkv output.srt
例子中生成的是 srt 格式的,可以任意生成所需的格式,改一下扩展名即可。