mkvextract -- 将 Matroska(tm) 文件中的轨道提取为单独的文件

# 1. 概要

mkvextract {输入文件名} {模式1} 选项 提取规格1 模式2 选项 提取规格2 …

# 2. 说明

该程序可将 Matroska(tm) 文件的指定部分提取为其他有用的格式。第一个参数是输入文件名，该文件必须为 Matroska(tm) 文件。

其余参数可切换到特定提取模式、更改当前活动模式的选项、指定要将什么内容提取到哪些文件。单次调用 mkvextract 可同时使用多种模式，以便只读取一遍就提取多项内容。 大多数选项只能在特定模式下使用，少数选项可用于所有模式。

目前支持提取 tracks 轨道、tags 标签、attachments 附件、chapters 章节、cue 表单、timestamps 时间戳 以及 cues。

## 2.1. 通用选项

以下选项在所有模式下可用，只在本段落讲一遍，不赘述。

Option | Description
--- | ---
-f, --parse-fully | 设置解析模式为 'full（完整）'。默认的解析模式不解析整个文件，而是使用元定位元素确定输入文件中所需元素的位置。99% 的情况下这已经足够。但如果碰到不含元定位元素或者元定位元素损坏的文件，用户可能得考虑使用此模式。完整扫描文件可能要花费几分钟，而快速扫描只需要几秒钟。
--command-line-charset 字符集 | 设定在命令行给出的字符串的字符集，用于转为其他字符集。默认为系统当前区域设置中所给定的字符集。
--output-charset 字符集 | 设置输出的字符串应被转换到何种字符集。默认为系统当前区域设置中所给定的字符集。
-r, --redirect-output 文件名 | 将所有信息输出至文件 文件名 而不是在命令行显示。尽管该操作可以用输出重定向轻松实现，但在某些情况下还需要靠它：如当终端在写入文件之前重新解释（覆盖输出）时。将优先使用通过 --output-charset 设定的字符集。
--flush-on-close | 让程序在关闭以写入模式打开的文件时，强制将内存中已缓存的所有数据写入到存储设备。可用于在电源中断时避免数据损失，或规避操作系统或驱动程序的特定问题。缺点是混流耗时更长，因为 mkvmerge 在退出前需要等待所有数据写入存储设备。关于优劣的深入讨论，请参见 MKVToolNix bug 跟踪平台中的问题 #2469 与问题 #2480。
--ui-language 语言代码 | 强制使用 语言代码 所对应的翻译 (例如 'de_DE' 表示德文翻译)。在 语言代码 处输入 'list' 可让程序输出可用翻译的列表。
--abort-on-warnings | 让程序在出现警告时即中止。程序的退出代码将返回 1。
--debug 主题 | 为特定功能开启调试。该选项仅对开发者有用。
--engage 功能 | 开启实验性功能。可用功能列表可通过 mkvextract --engage list 得到。这些功能在正常情况下不应该使用。
--gui-mode | 打开 GUI 模式。该模式下，将输出特殊格式的行，告知目前受控的 GUI 的行为。这些消息遵从格式「#GUI#消息」。消息可能包括键值对，如「#GUI#消息#键1=值1#键2=值2…」。消息内容及键的内容不作翻译，总是以英语输出。
-v, --verbose | 使输出信息更详尽，且每当读取到重要的 Matroska(tm) 元素时就将其显示。
-h, --help | 显示用法信息并退出。
-V, --version | 显示版本信息并退出。
@选项文件.json | 从文件 选项文件 读取其他命令行参数。关于支持的选项文件格式的详细说明，请参见 mkvmerge(1) 手册的“选项文件”段落。

## 2.2. 轨道提取模式

语法: mkvextract 输入文件名 tracks [选项] TID1:目标文件名1 [TID2:目标文件名2 ...]

以下命令行在「tracks」轨道提取模式下对各轨道可用。它们应当在所应用到的轨道指令（参阅下文）之前出现。

Option | Description
--- | ---
-c 字符集 | 设定下一个字幕轨应被转换为哪一字符集。仅当后面的轨道 ID 对应文本字幕轨时有效。默认为 UTF-8。
--blockadd 层级 | 只保留不高于此层级的 BlockAdditions (附加区块)。默认保留所有层级。 此选项仅影响特定类型的编解码器，如 WAVPACK4。
--cuesheet | 让 mkvextract(1) 根据下一轨道的标签数据与章节信息提取出 CUE 表单，输出文件名为轨道的输出名后接 '.cue' 扩展名。
--raw | 将原始数据提取为文件，输出文件的周围没有任何容器数据。 与 --fullraw 标记不同的是，此标记不会将 CodecPrivate 元素的内容写入输出文件。 此模式对所有 CodecIDs 有效，即使是 mkvextract(1) 不支持处理的，然而生成的文件可能无法使用。
--fullraw | 提取原始数据，输出文件的周围没有任何容器数据。 如果轨道包含 CodecPrivate 编解码器私有元素，它的内容将先被写入文件。 此模式对所有 CodecIDs 有效，即使是 mkvextract(1) 不支持的那些，但是生成的文件可能无法使用。
TID:输出文件名 | 如果输入文件中存在 ID 为 TID 的轨道，则将其提取为文件 输出文件名。本选项可多次给出。轨道 ID 与 mkvmerge(1) 的 --identify 选项所输出的相同。 每个输出文件名只能用一次。但 RealAudio 与 RealVideo 轨道例外。如果您为不同轨道使用了同样的输出文件名，这些轨道将被存入同一个文件中。示例：
    $ mkvextract 输入.mkv tracks 0:视频.h264 2:输出两个vobsub轨道.idx 3:输出两个vobsub轨道.idx

## 2.3. 附件提取模式

语法: mkvextract 输入文件名 attachments [选项] AID1:输出文件名1 [AID2:输出文件名2 ...]

Option | Description
--- | ---
AID:输出文件名 | 如果输入文件中存在 ID 为 AID 的附件，则将其提取为文件 输出文件名。如果 输出文件名 处留空，将使用所用 Matroska(tm) 文件中的附件名称。本选项可多次给出。附件 ID 与 mkvmerge(1) 的 --identify 选项所输出的相同。

## 2.4. 章节提取模式

语法: mkvextract 输入文件名 chapters[选项] 输出文件名.xml

Option | Description
--- | ---
-s, --simple | 将章节信息以 OGM tools 所用的简单格式 (CHAPTER01=..., CHAPTER01NAME=...) 导出。此模式下部分信息将被废弃。默认以 XML 格式输出章节。
--simple-language 语言 | 若启用简化格式，mkvextract(1) 对于发现的每个章节单位，均只输出单个条目，即使该章节单位包含多个章节名称。mkvextract(1) 默认对每个章节单位使用发现的第一个章节名称，而不考察其语言。 本选项允许用户决定，在章节单位包含多个章节名称时，应该输出哪些章节名称。语言 参数必须为 ISO 639-1 或 ISO 639-2 代码。

章节将写入指定的输出文件。默认使用 mkvmerge(1) 能理解的 XML 格式。如果文件中没有发现章节条目，则不会创建输出文件。

## 2.5. 标签提取模式

语法: mkvextract 输入文件名 tags [选项] 输出文件名.xml

标签将写入指定的输出文件，使用 mkvmerge(1) 能理解的 XML 格式。如果文件中没有发现标签条目，则不会创建输出文件。

## 2.6. Cue 表单提取模式

语法: mkvextract 输入文件名 cuesheet [选项] 输出文件名.cue

cue 表单将写入指定的输出文件。如果文件中没有发现章节或标签条目，则不会创建输出文件。

## 2.7. 时间戳提取模式

语法: mkvextract 输入文件名 timestamps_v2 [选项] TID1:目标文件名1 [TID2:目标文件名2 ...]

Option | Description
--- | ---
TID:输出文件名 | 如果输入文件中存在 ID 为 TID 的轨道，则将其时间戳提取为文件 输出文件名。本选项可多次给出。轨道 ID 与 mkvmerge(1) 的 --identify 选项所输出的相同。 示例:
    $ mkvextract 输入.mkv timestamps_v2 1:时间戳-轨1.txt 2:时间戳-轨2.txt

## 2.8. cue 提取模式

语法: mkvextract 输入文件名 cues [选项] TID1:目标文件名1 [TID2:目标文件名2 ...]

Option | Description
--- | ---
TID:目标文件名 | 若输入文件中存在，则提取 ID 为 TID 的轨道的 cue 并保存到 输出文件名 中。本选项可多次给出。轨道 ID 与 mkvmerge(1) 的 --identify 选项所输出的一致，而非 CueTrack 元素中所包含的数字。

输出的格式为简单文本格式: 每个 CuePoint 及 键=值 对占一行。如果 CuePoint 中未出现某个可选元素 (如 CueDuration) 则将输出短横作为其数值。

示例:

    timestamp=00:00:13.305000000 duration=- cluster_position=757741 relative_position=11

可用的关键词包括：

Option | Description
--- | ---
timestamp (时间戳) | cue point 的时间戳，精确到纳秒。格式为 HH:MM:SS.nnnnnnnnn。该元素必有值。
duration (时长) | cue point 的时长，精确到纳秒。
cluster_position (簇位置) | Matroska(tm) 文件中指向相关元素的簇的起始点的绝对位置，单位为字节。 Note: Matroska(tm) 文件中，CueClusterPosition 相对于剪辑数据的起始偏移。而 mkvextract(1) 的 cue 提取模式所输出的值，已经计入该偏移，因此是从文件开头起的绝对偏移。
relative_position (相对位置) | cue point 所指向的 BlockGroup 或 SimpleBlock 元素的起始点在簇内的绝对位置，单位为字节。 Note: Matroska(tm) 文件中，CueRelativePosition 相对于簇数据的起始偏移。而 mkvextract(1) 的 cue 提取模式所输出的值，相对于簇的 ID。在文件内的绝对位置可以通过将 cluster_position 与 relative_position 相加得出。

示例:

    $ mkvextract 输入.mkv cues 1:cues-轨1.txt 2:cues-轨2.txt

# 3. 示例

同时提取章节与标签，并按其相应的 XML 格式保存:

    $ mkvextract 影片.mkv chapters 影片章节.xml tags 影片标签.xml

同时提取一些轨道及其对应的时间戳:

    $ mkvextract "另一部影片.mkv" tracks 0:video.h265 "1:主音轨.aac" "2:导演评论.aac" timestamps_v2 "0:视频时间戳.txt" "1:主音轨时间戳.txt" "2:导演评论音轨时间戳.txt"

以 Ogg/OGM 格式提取章节，并将一条文本字幕轨道用另一种字符集重新编码:

    $ mkvextract "我的影片.mkv" chapters --simple "我的章节.txt" tracks -c MS-ANSI "2:我的字幕.srt"

# 4. 文本文件与字符集转换

关于 MKVToolNix 套件中所有工具如何处理字符集转换、输入/输出编码、命令行编码及控制台编码的深入讨论，请参见 mkvmerge(1) 手册中相对应名称的段落。

# 5. 输出文件格式

输出的格式取决于轨道的类型，而不是输出文件名的扩展名。目前支持以下轨道类型:

Option | Description
--- | ---
A_AAC/MPEG2/*, A_AAC/MPEG4/*, A_AAC | 所有 AAC 文件将被输出为 AAC 文件，其中数据包前有 ADTS 头。ADTS 头将不含反增强字段（deprecated emphasis field）。
A_AC3, A_EAC3 | 这些会提取为原始 AC-3 文件。
A_ALAC | ALAC 轨道将输出为 CAF 文件。
A_DTS | 这些会提取为原始 DTS 文件。
A_FLAC | FLAC 轨道将输出为原始的 FLAC 文件。
A_MPEG/L2 | MPEG-1 Audio Layer II 流将提取为原始的 MP2 文件。
A_MPEG/L3 | 这些会提取为原始 MP3 文件。
A_OPUS | Opus(tm) 轨道将输出为 OggOpus(tm) 文件。
A_PCM/INT/LIT, A_PCM/INT/BIG | 原始 PCM 数据将写入 WAV 文件。大端序整数数据在此期间将被转为小端序数据。
A_REAL/* | RealAudio(tm) 轨道将被输出为 RealMedia(tm) 文件。
A_TRUEHD, A_MLP | 这些会提取为原始 TrueHD/MLP 文件。
A_TTA1 | TrueAudio(tm) 轨道将被输出为 TTA 文件。请注意，由于 Matroska(tm) 时间戳的精度限制，解开来的文件的头部有两个字段不同：data_length (文件的总采样数) 与 CRC。
A_VORBIS | Vorbis 音频将被输出为 OggVorbis(tm) 文件。
A_WAVPACK4 | WavPack(tm) 轨道将输出为 WV 文件。
S_HDMV/PGS | PGS 字幕将输出为 SUP 文件。
S_HDMV/TEXTST | TextST 字幕将以转为 mkvmerge(1) 与 mkvextract(1) 发明的特殊格式写入。
S_KATE | Kate(tm) 流将以 Ogg(tm) 为容器输出。
S_TEXT/SSA, S_TEXT/ASS, S_SSA, S_ASS | SSA 与 ASS 文本字幕将分别被输出为 SSA/ASS 文件。
S_TEXT/UTF8, S_TEXT/ASCII | 简单的文本字幕将被输出为 SRT 文件。
S_VOBSUB | VobSub(tm) 字幕将输出为 SUB 文件及相应的索引文件（后缀为 IDX）。
S_TEXT/USF | USF 文本字幕将输出为 USF 文件。
S_TEXT/WEBVTT | WebVTT 字幕文件将写入 WebVTT 文件。
V_MPEG1, V_MPEG2 | MPEG-1 与 MPEG-2 视频轨道将输出为 MPEG 基本流（ES）。
V_MPEG4/ISO/AVC | H.264 / AVC 视频轨将被输出为 H.264 基本流，可以使用如 GPAC(tm) 工具包中的 MP4Box(tm) 作进一步处理。
V_MPEG4/ISO/HEVC | H.265 / HEVC 视频轨道将输出为 H.265 基本流（ES），该格式可使用 GPAC(tm) 软件包中的 MP4Box(tm) 作进一步处理。
V_MS/VFW/FOURCC | 使用此 CodecID 且 FPS 恒定的视频轨将被输出为 AVI 文件。
V_REAL/* | RealVideo(tm) 轨道将被输出为 RealMedia(tm) 文件。
V_THEORA | Theora(tm) 流将以 Ogg(tm) 为容器输出
V_VP8, V_VP9 | VP8 / VP9 轨道将输出为 IVF 文件。
标签 | 标签将被转换为 XML 格式。此格式与 mkvmerge(1) 所支持读取的标签格式相同。
附件 | 附件将被以原样输出。不会进行任何转换。
章节 | 章节将被转换为 XML 格式。此格式与 mkvmerge(1) 所支持读取的章节格式相同。您也可以选择输出精简的简单 OGM 格式。
时间戳 | 时间戳会先被排序，然后以 timestamp v2 格式文件输出，该文件适用于 mkvmerge(1)。不支持提取为其他格式 (v1, v3 或 v4)。

# 6. 退出代码

mkvextract(1) 退出时会返回以下三个退出代码中的一个：

- 0 -- 此退出代码说明已成功完成提取。

- 1 -- 这种情况下 mkvextract(1) 至少输出了一条警告信息，但提取并未因之中止。 警告信息以文字 '警告:' 为前缀。根据问题的不同，生成的文件可能是好的，也可能不是。 强烈建议用户检查警告信息以及生成的文件。

- 2 -- 此退出代码用于错误发生之后。 mkvextract(1) 在输出错误信息后即中断处理。错误信息可能是错误的命令行参数，也可能是损坏文件的读取/写入错误。

# 7. 环境变量

mkvextract(1) 使用决定系统区域设置的默认变量 (如 LANG 与 LC_* 族)。其他变量包括:

Option | Description
--- | ---
MKVEXTRACT_DEBUG, MKVTOOLNIX_DEBUG 及其缩略形式 MTX_DEBUG | 内容将被当作通过 --debug 选项传递的参数对待。
MKVEXTRACT_ENGAGE, MKVTOOLNIX_ENGAGE 及其缩略形式 MTX_ENGAGE | 内容将被当作通过 --engage 选项传递的参数对待。

# 8. 参阅

mkvmerge(1), mkvinfo(1), mkvpropedit(1), mkvtoolnix-gui(1)

# 9. 网络

最新版本总可以在 MKVToolNix 主页 找到。