图像与设计
用 FFmpeg 烧录/嵌入/提取/转换字幕与添加样式化字幕…
在需要给视频烧录硬字幕、添加软字幕轨、提取字幕、转换字幕格式或设置字幕样式与位置时使用 FFmpeg 完成。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 FFmpeg 烧录/嵌入/提取/转换通用
解决思路
- 烧录 SRT 字幕:`ffmpeg -i video.mp4 -vf "subtitles=subs.srt" output.mp4`
- 烧录 ASS/SSA 字幕(保留样式):`ffmpeg -i video.mp4 -vf "ass=subs.ass" output.mp4`
- 从 MKV 容器烧录字幕:`ffmpeg -i video.mkv -vf "subtitles=video.mkv" output.mp4`
- 烧录指定字幕轨(索引 0):`ffmpeg -i video.mkv -vf "subtitles=video.mkv:si=0" output.mp4`
- 按流索引烧录字幕:`ffmpeg -i video.mkv -vf "subtitles=video.mkv:stream_index=1" output.mp4`
- 强制覆盖样式:`-vf "subtitles=subs.srt:force_style='FontName=Arial,FontSize=24,PrimaryColour=&HFFFFFF,OutlineColour=&H000000,Outline=2,Shadow=1'"`
- 黄色字幕加黑边:`-vf "subtitles=subs.srt:force_style='FontSize=28,PrimaryColour=&H00FFFF,OutlineColour=&H000000,Outline=3'"`
- 为无障碍加大字号:`-vf "subtitles=subs.srt:force_style='FontSize=36,Bold=1'"`
- ASS 样式参数:FontName、FontSize、PrimaryColour、SecondaryColour、OutlineColour、BackColour、Bold、Italic、Underline、Outline、Shadow、Alignment、MarginL/R/V
- ASS 颜色格式为 &HAABBGGRR(Alpha、Blue、Green、Red),如白色 &HFFFFFF、黑色 &H000000、黄色 &H00FFFF、红色 &H0000FF、蓝色 &HFF0000、50% 透明黑 &H80000000
- 向 MP4 添加 SRT 软字幕轨:`ffmpeg -i video.mp4 -i subs.srt -c copy -c:s mov_text output.mp4`
- 向 MKV 添加 SRT 软字幕轨:`ffmpeg -i video.mp4 -i subs.srt -c copy -c:s srt output.mkv`
- 向 WebM 添加 WebVTT 软字幕轨:`ffmpeg -i video.webm -i subs.srt -c copy -c:s webvtt output.webm`
- 添加多语言字幕轨:`ffmpeg -i video.mp4 -i subs_en.srt -i subs_es.srt -i subs_fr.srt -map 0:v -map 0:a -map 1 -map 2 -map 3 -c copy -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:0 title="English" -metadata:s:s:1 language=spa -metadata:s:s:1 title="Spanish" -metadata:s:s:2 language=fra -metadata:s:s:2 title="French" output.mp4`
- 向 MKV 添加 ASS 字幕轨(保留样式):`ffmpeg -i video.mp4 -i styled.ass -map 0 -map 1 -c copy -c:s ass output.mkv`
- 设置默认字幕轨:`-disposition:s:0 default`
- 设置强制字幕:`-disposition:s:0 forced`
- 提取第一条字幕轨为 SRT:`ffmpeg -i video.mkv -map 0:s:0 output.srt`
- 提取指定字幕流:`ffmpeg -i video.mkv -map 0:s:1 output.srt`
- 提取为 ASS:`ffmpeg -i video.mkv -map 0:s:0 output.ass`
- 提取为 WebVTT:`ffmpeg -i video.mkv -map 0:s:0 output.vtt`
- 提取全部字幕轨:`ffmpeg -i video.mkv -map 0:s subs_%d.srt`
- 列出所有流(含字幕):`ffprobe -v error -show_entries stream=index,codec_name,codec_type:stream_tags=language,title -of csv=p=0 video.mkv`
- 仅列出字幕流:`ffprobe -v error -select_streams s -show_entries stream=index,codec_name:stream_tags=language,title -of csv=p=0 video.mkv`
- SRT 转 ASS:`ffmpeg -i subs.srt subs.ass`
- ASS 转 SRT(丢失样式):`ffmpeg -i subs.ass subs.srt`
- SRT 转 WebVTT:`ffmpeg -i subs.srt subs.vtt`
- WebVTT 转 SRT:`ffmpeg -i subs.vtt subs.srt`
- drawtext 叠加与 Whisper AI 转录示例见 `references/drawtext-and-whisper.md`,在需要烧录文字图形或从语音生成字幕时加载该参考
- 提取 ATSC 流中的 CEA-608 字幕:`ffmpeg -f lavfi -i "movie=broadcast.ts[out0+subcc]" -map 0:1 captions.srt`
- 从含内嵌 CC 的视频提取:`ffmpeg -i video_with_cc.mp4 -filter_complex "[0:v]format=yuv420p[v];[0:v]crop=1:1:0:0[c]" -map "[c]" -c:v libx264 -f null - 2>&1 | grep -A 1 "Closed caption"`
- 嵌入 CEA-608 字幕:`ffmpeg -i video.mp4 -i captions.scc -c:v libx264 -c:a copy -vf "movie=captions.scc[captions];[0:v][captions]overlay" output.mp4`
- ASS 对齐值:7 左上、8 上中、9 右上、4 左中、5 中中、6 右中、1 左下、2 下中、3 右下
- 顶部居中字幕:`-vf "subtitles=subs.srt:force_style='Alignment=8,MarginV=20'"`
- 左对齐字幕:`-vf "subtitles=subs.srt:force_style='Alignment=1,MarginL=50,MarginV=30'"`
- 右侧字幕用于说话人标识:`-vf "subtitles=subs.srt:force_style='Alignment=3,MarginR=50'"`
- 两条字幕轨不同位置:`-vf "[in]subtitles=speaker1.srt:force_style='Alignment=1,MarginL=50'[tmp];[tmp]subtitles=speaker2.srt:force_style='Alignment=3,MarginR=50'"`
- 批量烧录字幕脚本:遍历 `*.mp4`,若存在同名 `.srt` 则执行 `ffmpeg -i "$video" -vf "subtitles=${base}.srt:force_style='FontSize=24,Outline=2'" -c:a copy "output/${base}_subbed.mp4"`
- 批量转换字幕格式脚本:遍历 `*.srt`,执行 `ffmpeg -i "$srt" "${base}.vtt"`
- 报错 "Unable to find a suitable output format" 时显式指定输出格式:`ffmpeg -i video.mkv -map 0:s:0 -f srt output.srt`
- 字幕乱码时强制 UTF-8:`-vf "subtitles=subs.srt:charenc=UTF-8"`
- 字体找不到时指定字体目录:`-vf "subtitles=subs.srt:fontsdir=/path/to/fonts"`,并用 `fc-list : family | sort | uniq` 列出可用字体
- 字幕时间偏移:延迟 2 秒用 `-vf "subtitles=subs.srt:itsoffset=2"`,或用 `ffmpeg -i subs.srt -itsoffset 2 delayed.srt`
- 高分辨率视频字幕不显示时放大字号:`-vf "subtitles=subs.srt:force_style='FontSize=48,Outline=3'"`
- 验证字幕存在:`ffprobe -v error -select_streams s -show_entries stream=codec_name -of default=nw=1 video.mp4`
- 统计字幕行数:`grep -c "^[0-9]" subs.srt`
- 校验 SRT 格式:`ffmpeg -i subs.srt -f null -`
- 无障碍最佳实践:高对比配色(深底白字或深底黄字)、标准视频最小字号 24pt、多说话人加标识、避免遮挡重要画面、每行不超过 42 字符、每条字幕显示 1 至 7 秒
- 质量最佳实践:样式化字幕(动画、MV)用 ASS,简单对白用 SRT,网页交付用 WebVTT,尽量保留原始样式,分发前在目标设备测试
- 性能最佳实践:仅在必要时烧录字幕(流媒体、兼容性),归档和灵活性优先用软字幕,大文件烧录时用硬件编码,批量操作并行处理
适用边界 · 注意事项
- 需要绘制形状或图形叠加时,应改用 shapes-graphics 技能
- 在 Windows 上使用 Edit 或 Write 工具时,文件路径必须使用反斜杠 `\` 而非正斜杠 `/`
- 除非用户明确要求,否则不要创建新的文档文件