用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、SimHei
  • FontSize:字号,如 24
  • PrimaryColour:主文字颜色,格式为 &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 字幕文件中直接定义。

五、字幕格式与对应编码器
字幕格式软字幕编码器说明
SRTmov_text(MP4)、srt(MKV)最通用的纯文本字幕格式
ASS/SSAass(MKV)支持丰富样式、特效、动画
VTTwebvtt用于 Web 平台
PGS/SUPhdmv_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
友链