用FFmpeg设置视频中的字幕
🎯 字幕设计对观众体验的影响
字幕是视频内容可访问性和传播力的重要保障,设计合理的字幕能显著提升观看体验:
- 硬字幕 vs 软字幕:硬字幕直接将文字渲染到画面上,适合短视频平台(抖音、快手)确保所有观众都能看到;软字幕作为独立轨道封装,适合长视频和国际化内容,观众可自由开关或切换语言。
- 多语言支持:软字幕可同时嵌入多个语言轨道(中文、英文、日文等),让视频触及更广泛的国际观众。每个语言轨道使用独立的字幕文件。
- 视觉设计:字幕的字体、大小、颜色和位置直接影响可读性。白色文字+黑色描边是最安全的选择,在任何背景下都能清晰显示。避免将字幕放置在画面关键内容区域。
- 时间轴同步:字幕显示时长应与语速匹配——中文建议每行不超过15个字,显示时间不少于1.5秒,确保观众有充足时间阅读。过短会阅读困难,过长则会分散注意力。
FFmpeg 字幕嵌入详解
FFmpeg 支持两种字幕嵌入方式:硬字幕(Hard Subtitle)和软字幕(Soft Subtitle),二者在原理、性能和用户体验上存在本质区别。
一、硬字幕(Hard Subtitle / Burn-in)
硬字幕通过 subtitles 滤镜将字幕直接渲染到每一帧视频画面上,字幕成为视频帧的永久组成部分。这种方式的特点是:
- 永久嵌入:字幕与视频像素融为一体,无法在播放时关闭或切换。
- 必须重新编码:由于需要将字幕渲染到帧上,视频流必须经过编解码器重新压缩(
-c:v libx264等),无法使用-c:v copy。 - 兼容性最好:所有播放器和设备都能显示,因为字幕已是画面的一部分。
- 原始视频质量损失:重新编码会导致画质下降,且多次编码会累积损失。
典型用法:ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" output.mp4
二、软字幕(Soft Subtitle)
软字幕将字幕文件作为独立的轨道封装到视频容器(如 MP4、MKV)中,播放时由播放器动态渲染显示。这种方式的特点是:
- 可选择性开关:播放时用户可以随时开启或关闭字幕显示。
- 支持多语言:可以同时嵌入多个语言的字幕轨道,用户随意切换。
- 无需重新编码视频:视频和音频流可以使用
-c:v copy -c:a copy直接复制,不损失画质,处理速度极快。 - 兼容性依赖播放器:需要在播放器端支持对应字幕格式(如 mov_text、srt、ass)。
典型用法:ffmpeg -i input.mp4 -i subtitle.srt -c:v copy -c:a copy -c:s mov_text output.mp4
三、硬字幕 vs 软字幕 对比
| 对比项 | 硬字幕 | 软字幕 |
|---|---|---|
| 编码方式 | 必须重新编码 | -c copy 不重编码 |
| 画质影响 | 有损失(重新压缩) | 无损(直拷) |
| 开关控制 | 无法关闭 | 可随时开关 |
| 多语言支持 | 仅一种语言(需重新编码切换) | 多种语言轨道共存 |
| 兼容性 | 所有设备 | 依赖播放器支持 |
| 处理速度 | 慢(需完整编解码) | 快(仅封装) |
四、force_style 自定义字幕样式
在使用硬字幕时,可以通过 force_style 参数覆盖字幕文件的样式定义或为字幕指定基本外观。支持的样式属性包括:
FontName:字体名称,如 Arial、SimHeiFontSize:字号,如 24PrimaryColour:主文字颜色,格式为&HAABBGGRR&(Alpha、蓝、绿、红),如&H00FFFFFF&为白色SecondaryColour:次要颜色(用于卡拉OK等特效)OutlineColour:描边颜色BackColour:阴影/背景颜色Bold:粗体(-1 开启,0 关闭)Italic:斜体MarginV:垂直边距Alignment:对齐方式(1=左下,2=底部居中,3=右下,5=左上,6=顶部居中,7=右上,9=正中)
示例:ffmpeg -i input.mp4 -vf "subtitles=sub.srt:force_style='FontName=SimHei,FontSize=28,PrimaryColour=&H00FFFF&,Bold=-1'" output.mp4
注意事项:force_style 对所有字幕行统一生效,若需每行不同样式请在 ASS 字幕文件中直接定义。
五、字幕格式与对应编码器
| 字幕格式 | 软字幕编码器 | 说明 |
|---|---|---|
| SRT | mov_text(MP4)、srt(MKV) | 最通用的纯文本字幕格式 |
| ASS/SSA | ass(MKV) | 支持丰富样式、特效、动画 |
| VTT | webvtt | 用于 Web 平台 |
| PGS/SUP | hdmv_pgs_subtitle(蓝光) | 图形字幕,基于图片 |
六、常用场景建议
- 发布到社交媒体(抖音、YouTube):用硬字幕,确保所有观众都能看到。
- 保存个人媒体库:用软字幕,保留原始画质和灵活切换能力。
- 多语言版本:用软字幕嵌入多种语言轨道,观众自由选择。
- 专业制作:使用 ASS 格式配合 force_style 精细控制字幕外观。
广告
{{v.name}}
字幕分为硬字幕和软字幕。
硬字幕永久嵌入视频帧中,成为画面的一部分,无法关闭。
软字幕作为独立轨道嵌入视频文件,播放时可选择性开启或关闭。
硬字幕会直接将字幕渲染到视频帧上,代码如下
$ ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" output_hardsub.mp4
通过 force_style 参数覆盖字幕文件中的样式或为 ASS/SRT 字幕指定基本样式,代码如下
$ ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt:force_style='FontName=Arial,FontSize=24,PrimaryColour=&HFFFFFF&'" output_styled.mp4
指定字体路径(如果字体文件不在系统默认目录),代码如下
$ ffmpeg -i input.mp4 -vf "subtitles=subtitle.ass:fontsdir=/path/to/fonts/" output_with_fonts.mp4
软字幕将字幕作为独立的轨道封装到视频容器中,播放时可以选择是否显示,代码如下
$ ffmpeg -i input.mp4 -i subtitle.srt -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=eng output_softsub.mp4
添加多个软字幕(多语言),代码如下
$ ffmpeg -i input.mp4 -i sub_eng.srt -i sub_chi.srt -map 0 -map 1 -map 2 -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:1 language=zho output_multiple_subs.mp4