使用 FFmpeg 为视频嵌入硬字幕

使用 FFmpeg 为视频嵌入硬字幕,以及在 Windows 下为 subtitles 设置路径参数需要使用 / 而不是 \ 作为路径分隔符。

对于视频字幕,我更喜欢视频文件 + 字幕文件的形式,这样既可以观看不带任何字幕和水印的原版视频,也可以随时开启字幕。但是某些场景下,播放器不支持自动加载字幕,因此尝试直接通过 FFmpeg 烧制硬字幕。

  • 硬字幕:渲染在视频画面上的字幕,不可关闭
  • 软字幕:在播放器支持的情况下,可以自由开关字幕

FFmpeg 常见的字幕烧制命令:

1
ffmpeg -i input.mp4 -vf "subtitles=input.ass" -c:a copy output.mp4

字幕本身存在多种格式,常见的是 srt 格式,这种格式只能显示文本,不方便设置字体、字号等信息。将 srt 转成 ass 格式,就可以自由调整字体、字号、颜色等信息,实现专业字幕组的播放效果。

在实际使用 FFmpeg 烧制字幕时,有几个需要注意的点:

1)文件名带空格,需要使用双引号括起来

1
ffmpeg -i "X Y Z.mp4" -vf "subtitles=X Y Z.ass" -c:a copy output.mp4

2)文件名带有路径信息,在 Windows 下使用 / 而不是 \ 作为路径分隔符,不管是相对路径还是绝对路径,字幕文件名参数都需要这样处理,比如:

1
ffmpeg -i "in\X Y Z.mp4" -vf "subtitles=in\X Y Z.ass" -c:a copy output.mp4

FFmpeg 会提示如下错误:

1
2
3
4
5
[Parsed_subtitles_0 @ 000002b418a5e180] Unable to open inX Y Z.ass
[AVFilterGraph @ 000002b4184296c0] Error initializing filters
[vost#0:0/libx264 @ 000002b418428380] Error initializing a simple filtergraph
Error opening output file output.mp4.
Error opening output files: No such file or directory

改成如下命令则可以正常处理:

1
ffmpeg -i "in\X Y Z.mp4" -vf "subtitles=in/X Y Z.ass" -c:a copy output.mp4

FFmpeg subtitles 无法正确处理 Windows 路径参数