FFMPEG 中级指南/字幕选项
字幕可以来自单独的文本文件(通常扩展名为 .srt)或来自视频文件中的专用流。在后一种情况下,字幕通常存储为位图而不是文本,这些位图叠加在视频上,对于 DVD 可能被称为“VOBSUB”,对于蓝光则可能被称为“PGS”。
请注意,字幕流不必在整个视频中都存在,并且可能仅在第一次出现字幕对话时才出现。因此,字幕流可能不会被
ffmpeg -i <input>
检测到并列出,它仅搜索输入文件中的短距离。
要强制 ffmpeg 进一步搜索字幕流,请使用选项
-probesize <bytes> -analyzeduration <microseconds>
这将使 ffmpeg 继续搜索,直到达到这些限制中的第一个限制。请注意,这两个选项都必须在命令行上出现,然后才能通过 -i 指定输入。例如
ffmpeg -probesize 50M -analyzeduration 100M -i vts.vob
将搜索 vts.vob 中的所有流,直到它读取了 50 MB 的数据或 100 秒的视频,以先到者为准。
字幕可以作为 并行流 包含在编码的视频文件中,也可以被 永久渲染(也称为“刻录”)到视频本身中。
ffmpeg -i "INPUT" [-sub_charenc [character encoding]] -i "SUBTITLE_INPUT" -vcodec [codec] -acodec [codec] -scodec [codec] [...] "OUTPUT"
设置输入文本字幕字符编码转换
-sub_charenc [character encoding]
如果您要导入并编码包含某些语言(如法语、德语、意大利语、西班牙语等)特殊字符的字幕纯文本文件(Windows/ANSI),则需要此选项将字幕编码从 Windows/ANSI 转换为 UTF-8。
[字符编码] 参数示例
CP1252、CP874、CP936、CP1250、...、CP1258、
LATIN1、LATIN2、...、LATIN8、LATIN-9、LATIN10、
ISO-8859-1、ISO-8859-2、...、ISO-8859-16、
UTF-8、UTF-16、UTF-32
UNICODEBIG、UNICODELITTLE
另请参见:sub_charenc_parameters.txt 在 #2431 中
笔记
[-sub_charenc [字符编码]] 不是必需的,但无论何时使用,它都必须放在要使用该编码处理的字幕的引用之前。
当您设置字幕编码时,不要忘记也设置字幕编解码器(见下文)。如果您使用 -c:s copy
,字幕代码页将不会被转换!
如果您尝试在没有使用“-sub_charenc”的情况下使用较新版本的 FFmpeg 导入 ANSI 字幕文件,您可能会收到类似的错误消息
解码字幕文本中的 UTF-8 无效;可能缺少 -sub_charenc 选项
然后,您必须使用“-sub_charenc”选项来定义字幕文件的正确编码格式或代码页。
强制设置字幕编解码器('copy' 用于复制流)
-scodec [subtitle codec]
并非每个字幕编解码器 都可以用在每个视频容器格式中!
[字幕编解码器] 参数示例
对于MKV 容器:copy
、ass
、srt
、ssa
对于MP4 容器:copy
、mov_text
对于MOV 容器:copy
、mov_text
笔记
许多飞利浦蓝光播放器、三星智能电视和其他独立播放器只能读取“MKV”文件中“SRT”字幕流。
使用 ISO 639 语言代码(3 个字母)设置字幕语言
-metadata:s:s:[stream number] language=[language code]
-metadata:s:s:0
... 这表示要设置... Stream:Subtitle:流号,从 0 开始 的元数据
[语言代码] 参数示例
eng
- 英语
fre
或 fra
- 法语
ger
或 deu
- 德语
ita
- 意大利语
spa
或 esp
- 西班牙语
ffmpeg -i input.mp4 -sub_charenc CP1252 -i subtitle.srt -map 0:v -map 0:a -c copy -map 1 -c:s:0 mov_text -metadata:s:s:0 language=ger output.mp4
ffmpeg -i input.mkv -sub_charenc CP1252 -i subtitle.srt -map 0:v -map 0:a -c copy -map 1 -c:s:0 srt -metadata:s:s:0 language=fre output.mkv
或
ffmpeg -i input.mp4 -sub_charenc CP1252 -i subtitle.srt -vcodec copy -acodec copy -scodec mov_text -metadata:s:s:0 language=ger output.mp4
ffmpeg -i input.mkv -sub_charenc CP1252 -i subtitle.srt -vcodec copy -acodec copy -scodec srt -metadata:s:s:0 language=fre output.mkv
2 个独立的 .srt 字幕文件的示例
ffmpeg -i input.mp4 -i subtitle_eng.srt -i subtitle_fre.srt \ -map 0:v -map 0:a -map 1 -map 2 \ -c:v copy -c:a copy -c:s copy \ -metadata:s:s:0 language=eng -metadata:s:s:1 language=fre \ output.mkv
ffmpeg -i input.mov -sub_charenc WINDOWS-1252 -i subtitle.srt -vcodec h264 -acodec mp3 -scodec mov_text -metadata:s:s:0 language=spa output2.mp4
ffmpeg -i input.avi -sub_charenc ISO-8859-1 -i subtitle.srt -vcodec h264 -acodec ac3 -scodec srt -metadata:s:s:0 language=ita output2.mkv
通过在命令行上指定一个复杂的过滤器,字幕可以永久地渲染到视频流中
-filter_complex "[0:v][0:s]overlay"
这可以解释为“从第一个列出的输入中获取所有视频流,然后从第一个列出的输入中获取所有字幕流,并将后者叠加到前者,以生成一个取代所有消耗流的单个视频流”。新流将由编码器映射,就像任何正常的视频输入流一样。
对于 VOBSUB(即 DVD 上的位图字幕),字幕的颜色由 DVD 上的 .IFO 文件中指定的调色板决定,但 ffmpeg 无法访问它,因此字幕的颜色将很大程度上是任意的,除非在命令行上使用以下命令指定调色板
-palette "<list of 16 comma-separated RRGGBB hex codes>"
不幸的是,用于渲染字幕的调色板条目在不同的视频之间会有所不同,因此需要一些实验。通常,一个条目将决定字体颜色,另一个条目将决定轮廓颜色,尽管有些视频的字幕使用多个轮廓,每个轮廓都有自己的调色板条目。
搜索字幕流的相对较深的深度,然后将其以绿色和黑色渲染到 h264 输出视频中的完整命令行可能如下所示
ffmpeg -probesize 100M -analyzeduration 120M -palette "ffffff,000000,ffffff,00ff00,ffffff,ffffff,ffffff,ffffff,ffffff,ffffff,ffffff,ffffff,ffffff,ffffff,ffffff,ffffff" -i input.vob -filter_complex "[0:v][1:s]overlay" -acodec copy -vcodec libx264 output.mp4