跳转到内容

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 容器:copyasssrtssa
对于MP4 容器:copymov_text
对于MOV 容器:copymov_text

笔记
许多飞利浦蓝光播放器、三星智能电视和其他独立播放器只能读取“MKV”文件中“SRT”字幕流。

设置字幕语言

[编辑 | 编辑源代码]

使用 ISO 639 语言代码(3 个字母)设置字幕语言

-metadata:s:s:[stream number] language=[language code]

-metadata:s:s:0 ... 这表示要设置... Stream:Subtitle:流号,从 0 开始 的元数据

[语言代码] 参数示例
eng - 英语
frefra - 法语
gerdeu - 德语
ita - 意大利语
spaesp - 西班牙语

FFmpeg 命令行示例导入字幕文件

[编辑 | 编辑源代码]

导入字幕文件(复制视频/音频流,不重新编码)

[编辑 | 编辑源代码]
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
华夏公益教科书