如果你在 FFmpeg 中尝试将 SRT 字幕转换为蓝光 PGS 格式,或者反过来把 PGS 位图字幕提取为 SRT 文本,很可能会遇到这样一个错误提示:「subtitle encoding currently only possible from text to text or bitmap to bitmap」。这个看似简单的限制,实际上是一个从 2014 年就存在的遗留问题 ——FFmpeg Trac #3819。在长达十年的时间里,开发者们尝试了各种变通方案,但始终没有从根源上解决文本格式与位图格式之间的互转难题。直到 2024 年,开发者 David Connolly 发布了基于 FFmpeg 8.1 的补丁版本,为这一困境画上了句号。

问题的技术根源

FFmpeg 的字幕处理管线在设计之初采用了严格的类型约束机制。文本型字幕(如 SRT、ASS/SSA、WebVTT)本质上是一系列带有时间戳和样式信息的字符串,而位图型字幕(如蓝光 PGS、DVD 导航 subtitle)则是逐帧的图像数据。这两种数据模型在内存表示、渲染管线和编码逻辑上存在根本性差异。原始实现只允许同类型之间的转换:文本转文本、位图转位图。对于跨类型的转换需求,系统直接抛出错误而非提供 fallback 路径。

这种设计选择在当时有其合理性 —— 它简化了 codec 层的工作,避免了隐式的复杂转换逻辑。但随着蓝光原盘、 streaming 素材和可访问性需求的激增,跨格式转换变成了一个真实存在的刚性需求。用户在处理蓝光原盘时经常需要将 PGS 位图字幕转换为可编辑的 SRT 文本,而在制作多平台分发版本时,又需要将 SRT 转为 PGS 以确保兼容性。

补丁实现的核心机制

David Connolly 的解决方案并非简单地在现有代码库上打补丁,而是引入了两条全新的转换路径。文本到位图(text-to-bitmap) 转换依赖于 libass 库,将带有样式信息的文本字幕渲染为 RGBA 图像序列,然后编码为 PGS 格式。补丁中新增的 PGS 编码器(对应 FFmpeg Trac #6843)负责将渲染后的位图帧组装为符合蓝光规范的 SUP 单元。更重要的是,这套实现自动检测动画效果—— 淡入淡出、颜色变化和位移都能被识别并保留,无需手动标记关键帧。

位图到文本(bitmap-to-text) 方向的实现则借助了 Tesseract OCR 引擎。补丁版本的 FFmpeg 内置了对 114 种语言的支持,当输入流检测到 PGS、DVD DVB 或其他位图格式时,自动调用 OCR 模块进行文本提取。提取结果以 SRT 格式输出,时间轴信息直接从原始位图的显示时间戳继承。对于包含多语言轨道和重叠字幕的复杂场景,补丁也做了妥善处理。

实践命令与参数要点

基于补丁版本的操作方式极为简洁,FFmpeg 会自动识别转换方向并选择合适的管线。以下是几种典型场景的标准命令:

将 SRT 文本字幕转换为蓝光 PGS 位图格式时,只需指定输出编解码器为 pgssub 并设置目标分辨率。命令 ffmpeg -i subtitles.srt -s 1920x1080 output.sup 会调用 libass 完成渲染并输出符合蓝光规范的 SUP 文件。如果源文件是包含字幕轨道的 MKV 容器,可以直接执行 ffmpeg -i input.mkv -c:v copy -c:a copy -c:s pgssub output.mkv,FFmpeg 会保留视频和音频流,只替换字幕轨道。

反向转换 —— 从 PGS 位图提取为 SRT 文本 —— 同样简洁:ffmpeg -i input.mkv -c:s srt output.srt。这一命令会触发内部的 OCR 流程,将每一帧位图识别为对应的文本内容。值得注意的是,OCR 质量取决于原始位图的清晰度和字体渲染效果,对于低分辨率的 DVD 字幕可能需要预先进行图像增强处理。

对于需要额外 OCR 语言数据的场景,补丁版本提供了两种变体:minimal 版本仅包含 ffmpeg 和 ffprobe 二进制文件,适合对体积敏感的环境;-eng 变体则预置了英文字库。其他语言需要从官方 tessdata 发行版下载对应的 .traineddata 文件并放置在二进制文件同级的 tessdata/ 目录中。

工程价值的评估

这个历时十年的问题之所以值得关注,不仅因为它解决了一个具体的格式壁垒,更因为它展示了社区驱动的开源项目如何处理长期遗留的技术债务。FFmpeg 作为一个拥有庞大用户基础和复杂依赖关系的核心工具,任何改动都需要谨慎评估向后兼容性和回归测试覆盖。David Connolly 的补丁通过了 18 项 FATE 测试并在 GitHub Actions 上实现了每次提交的持续集成,这为生产环境部署提供了基本的信心保障。

从系统设计的角度审视,这个案例也提醒我们:早期的设计约束在技术演进过程中可能变成阻碍。文本字幕和位图字幕之间的界限并非不可逾越 —— 通过引入渲染层和 OCR 层,FFmpeg 成功地在保持架构清晰性的同时扩展了能力边界。对于其他面临类似约束的系统组件,这提供了一个渐进式演进的参考范本。

如果你正在处理跨格式字幕转换的需求,建议验证当前使用的 FFmpeg 版本是否已包含相关补丁。官方社区正在推动将这些改进合并至主线版本,但在合并完成之前,David Connolly 提供的预编译二进制是一个稳定可靠的解决方案。

资料来源:本文技术细节主要参考了 David Connolly 在 GitHub Pages 上发布的 FFmpeg Subtitle Tools 项目页面,该项目实现了基于 FFmpeg 8.1 的 PGS 编码器并提供了 88 种新增格式转换能力。