mkvmerge -- 将多媒体流合并到 Matroska(tm) 文件中

# 1. 概要

mkvmerge [全局选项] {-o 输出文件} [选项1] {文件1} [[选项2] {文件2}] [@选项文件]

# 2. 说明

本程序可读取多种媒体文件并将它们的数据流（全部或者按选择）合并到 Matroska(tm) 文件中去；参见 Matroska 网站。

Important:

命令行选项的顺序很重要。若您对程序还不熟悉，请阅读 "选项顺序" 段落。

## 2.1. 全局选项

Option | Description
--- | ---
-v, --verbose | 增强“详细”程度。
-q, --quiet | 取消状态输出。
-o, --output 文件名 | 写至文件 文件名。如果使用了切割功能，对此参数的处理将有所不同。 详情请参阅关于 --split 选项的说明。
-w, --webm | 创建 WebM 兼容文件。如果输出文件扩展名为 "webm" 则将自动开启本选项。此模式将实施一些限制。只允许使用编解码器为 VP8 视频与 Vorbis 音频的轨道。章节与标签功能都不允许使用。DocType 文档类型头项将更改为 "webm"。
--title 标题 | 设置整个生成文件的标题，比如电影名称。
--default-language 语言代码 | 设置默认语言代码。所有轨道将使用此语言码，除非被用 --language 选项覆盖。默认的语言代码是 'und' 代表 'undefined'（未定）。

## 2.2. 剪辑信息处理 (全局选项)

Option | Description
--- | ---
--segmentinfo 文件名.xml | 从 XML 文件中读取剪辑信息。此文件可以包含剪辑族的 UID、剪辑的 UID、上一剪辑以及下一剪辑的 UID 元素。示例文件以及 DTD 已包含在 MKVToolNix 发布包中。 详情请参见下文关于 剪辑信息 XML 文件 的段落。
--segment-uid SID1,SID2,... | 设定要使用的剪辑 UID。这是个逗号分割的 128 位 UID 列表，UID 为通常的格式: 十六进制数字，"0x" 前缀可选，空格可选，但必须恰好有 32 个数位。 创建的每个文件都包含一个剪辑，每个剪辑有一个剪辑 UID。如果指定的剪辑 UID 比创建的剪辑多，则多余的 UID 将被忽略。如果指定的 UID 比创建的剪辑少，则将随机创建 UID。

## 2.3. 章节与标签处理 (全局选项)

Option | Description
--- | ---
--chapter-language 语言代码 | 设置各章节项的 ISO639-2 语言代码。 默认为 'eng'。 详情参见下文中关于 章节 的段落。 此选项可用于简单章节文件与包含章节但不含章节语言信息的源文件，如 MP4 与 OGM 文件。
--chapter-charset 字符集 | 设置简单章节文件所用的字符集，用以转为 UTF-8。关于 mkvmerge(1) 如何在字符集之间转换的说明请参见关于 文本文件与字符集 的段落。 此开关亦可应用到从特定容器类型，如 Ogg/OGM 和 MP4 文件中复制而来的章节。 详情参见下文关于章节的段落。
--cue-chapter-name-format 格式 | mkvmerge(1) 支持读取音频文件的 CUE 表单作为章节输入。CUE 表单中各索引项通常含有 PERFORMER（表演者） 与 TITLE（标题） 项。mkvmerge(1) 使用这两个字串构建章节名称。使用此选项可设定构建名称所用的格式。 如果此选项未给定则 mkvmerge(1) 默认使用 '%p - %t' 格式 (表演者, 后接空格, 一个破折号, 另一个空格以及标题)。 如果给定了格式，则除了后续的标签字符以外都将被原样复制，标签字符将被进行下述替换: %p 被当前项的 PERFORMER（表演者） 字符串替代, %t 被当前项的 TITLE（标题） 字符串替代, %n 被当前轨道编号替代，此外 %N 被当前轨道衬式编号（小于 10 则在前面加零）替代。
--chapters 文件名 | 从文件 文件名 读取章节信息。详情参阅下文关于 章节 的段落。
--global-tags 文件名 | 从文件 文件名 读取全局标签。详情参阅下文关于 标签 的段落。

## 2.4. 全局输出控制 (高级全局选项)

Option | Description
--- | ---
--track-order FID1:TID1,FID2:TID2,... | 此选项更改输入文件创建时轨道的顺序。变量为逗号分隔的成对的 ID 列。每对先包含有文件 ID (FID1)，即文件在命令行中的顺序，由 0 开始计数。第二个是在该文件中的轨道 ID (TID1)。 如果省去部分轨道的 ID，则这些轨道将在使用本选项给定的轨道创建之后创建。
--cluster-length 指令 | 限制每个簇中数据块的数量或数据的时长。指令 参数可以是无单位的数字 n，也可以是后缀有 'ms' 的 d。 如果未使用数字，mkvmerge(1) 将在每个簇中放置最多 n 个数据块。最大块数是 65535。 如果数字 d 后缀有 'ms'，mkvmerge(1) 将在每个簇中放置最多 d 毫秒的数据。d 的最小值是 '100ms'，最大值是 '32000ms'。 mkvmerge(1) 默认每簇最多放置 65535 个数据块或 5000ms 的数据。 尝试定位到特定帧的程序只能直接定位到簇，然后需要读取整个簇（来完成定位）。因此创建较大的簇将导致定位不精确或缓慢。
--no-cues | 让 mkvmerge(1) 不要创建或写入 cue 索引（ 可类比作 AVI 文件中的索引）。没有索引的 Matroska(tm) 文件也能播放，但定位可能不精确且缓慢。仅当您确实强求空间或用作测试时使用此选项。请参阅可为各输入文件指定的 --cues 选项。
--clusters-in-meta-seek | 告诉 mkvmerge(1) 在文件末尾创建包含所有簇的元定位元素。参阅关于 Matroska 文件规划 的段落。
--disable-lacing | 禁用所有轨道的紧缩。这将增加文件大小，尤其是当有很多音频轨时。此选项不供日常之用。
--enable-durations | 为所有块写入时长。这将增大文件尺寸，而且目前对播放器来说不提供任何额外的益处。
--timecode-scale 系数 | 强制时间码缩放系数为 系数。有效值域为 1000..10000000 或特殊值 -1。 通常 mkvmerge(1) 会使用数值 1000000，这样时间码和时长的精度为 1ms。对于不包含视频轨但含有至少一条音频轨的文件，mkvmerge(1) 将自动选择一个时间码缩放系数以使各轨的音频采样精度相同。这将引起更大的额外开销，但将允许更为精确的定位与提取。 如果使用了特殊值 -1，即使有视频轨，mkvmerge(1) 也将使用采样精度。

## 2.5. 文件切割、连接、追加及合并 (其他全局选项)

Option | Description
--- | ---
--split 指令 | 在给定尺寸或时间之后切割输出文件。请注意，各轨道只能在关键帧之前的位置切割开。由于缓冲原因，mkvmerge(1) 将在达到切割点后发现的首个关键帧前的位置切割。因此实际切割点可能比用户指定的稍稍靠后些。 目前 mkvmerge(1) 支持四种不同的模式。 按尺寸切割。 语法: --split [size:]d[k|m|g] 示例: --split size:700m 或者 --split 150000000 参数 d 可以以 'k'、'm' 或 'g' 结尾，分别说明尺寸的单位为 KB、MB 或 GB。 否则假定单位为字节。 当前输出文件达到此尺寸限制后将开始输出新的文件。 为兼顾兼容性，'size:' 前缀可以省略。 在一定时长后切割。 语法: --split [duration:]HH:MM:SS.nnnnnnnnn|ds 示例: --split duration:00:60:00.000 或 --split 3600s 此参数可以用 HH:MM:SS.nnnnnnnnn 的形式指定纳秒精度的时长，也可以是后接字母 's' 的指定秒数时长的数字 d。HH 为小时数，MM 为分钟数，SS 为秒数，而nnnnnnnnn 为纳秒数。 小时数与纳秒数均可省略。 小数点后最多可以有九位。 当前输出内容的时长达到此限制后将开始输出新的输出文件。 为兼顾兼容性，'duration:' 前缀可以省略。 在指定时间码后切割。 语法: --split timecodes:A[,B[,C...]] 示例: --split timecodes:00:45:00.000,01:20:00.250,6300s 参数 A、B、C 等等的格式与按时长切割模式（见上文）所用的格式相同。时间码表以逗号分隔。 输入流达到当前切割点的时间码后将创建新的输出文件。然后将使用所给定的下一个切割点。 'timecodes:' 前缀不得省略。 通过指定时间码区域，保留特定部分，并丢弃其余部分。 语法: --split parts:起点1-终点1[,[+]起点3-终点2[,[+]起点3-终点3...]] 示例: --split parts:00:01:20-00:02:45,00:05:50-00:10:30 --split parts:00:01:20-00:02:45,+00:05:50-00:10:30 --split parts:-00:02:45,00:05:50- parts 模式可以告诉 mkvmerge(1) 保留特定时间码范围，而丢弃其余部分。要保留的范围需要在 parts: 关键词后列出，以逗号隔开。各分段由起始及终止时间码组成，格式与其他 --split 模式所能接受的相同 (如 00:01:20 与 80s 代表相同的时间码)。 若起始时间码留空，则默认为前一段的终止时间码。若不存在前一段，则默认为文件开头 (参见示例 3)。 若终止时间码留空，则默认为文件末尾，亦即告诉 mkvmerge 保留其余部分 (参见示例 3)。 通常每一段都会写入新的文件。该行为也可以改变，将连续的分段写入同一个文件。要实现这种效果，用户可以在起始时间码开头加上 + 前缀。这样可以告诉 mvkmerge 不要创建新文件，而是将该分段写入与之前一段相同的文件当中。时间码也会自动调整，确保即使输入文件两分段间存在间隙，输出文件中也不出现间隙。 例 1 中 mkvmerge 会创建两个文件。第一个包含 00:01:20 到 00:02:45 之间的内容。第二个文件包含 00:05:50 到 00:10:30 之间的内容。 例 2 中 mkvmerge 将只创建一个文件。该文件包含 00:01:20 到 00:02:45 及 00:05:50 到 00:10:30 的内容。 例 3 中 mkvmerge 将创建两个文件。第一个包含源文件开头到 00:02:45 的内容。第二个文件将包含源文件 00:05:50 到结尾之间的内容。 此切割模式下输出文件名将以不同于常用操作的方式对待。可能会含有类似 printf 中 '%d' 的表达式，包括可选的字段宽度，如 '%02d'。如果含有上述表达式，当前文件序号将按相应格式生成，然后插入到文件名中的相应位置。 如果没有此类匹配模式，则假定匹配模式为在文件扩展名之前插入 '-%03d': '-o 输出.mkv' 将生成 '输出-001.mkv' 这样的一系列文件。如果没有扩展名，'-%03d' 将被追加在文件名之后。
--link | 切割输出文件时连接文件。详情请参阅下文 文件链接 段落。
--link-to-previous 剪辑-UID | 连接第一个输出文件到指定 剪辑-UID 参数对应的剪辑。详情请参阅下文 文件链接 段落。
--link-to-next 剪辑-UID | 连接最后一个输出文件到指定 剪辑-UID 参数对应的剪辑。详情请参阅下文 文件链接 段落。
--append-mode 模式 | 决定追加合并文件时如何计算时间码。 参数 模式 可以有两个数值: 默认的 'file（文件）' 和 'track（轨道）'。 当 mkvmerge 将来自另一文件 (本段中假设为 '文件2') 的一条轨道 (假设为 '轨道2_1' ) 追加合并到首个文件 (假设为 '文件1')的一条轨道 (假设为 '轨道1_1') 时，它将为 '轨道2_1' 的所有时间码设定一定量的延时。 对于 'file（文件）' 模式此延时量是 '文件1' 中遇到的最大时间码，即使此时间码不属于轨道 '轨道1_1'。而在 track （轨道模式）下此延时为 '轨道1_1' 的最大时间码。 不幸的是 mkvmerge 无法侦测使用哪种模式更为可靠。因此默认为 'file（文件）' 模式。'file' 模式对单独创建的文件的处理通常更好；例如在追加 AVI 或 MP4 文件时。'track（轨道）' 模式对一个大文件的完整分块的处理更好，例如对于 VOB 与 EVO 文件。 即使选用了 'track（轨道）' 模式，字母轨道也将按照 'file（文件）' 模式处理。
--append-to SFID1:STID1:DFID1:DTID1[,...] | 此选项控制要追加合并哪些轨道与哪些轨道。 各指令由四个 ID 组成: 源文件 ID, 源轨道 ID, 目标文件 ID 和目标轨道 ID。 第一对，"源文件 ID" 与 "源轨道 ID"确定要追加合并的轨道。 第二对，"目标文件 ID" 与 "目标轨道 ID"，确定源轨道要追加合并到的轨道。 如果忽略本选项，则将使用标准映射。 标准映射即将当前文件的各个轨道追加到前一个文件的相应轨道（轨道 ID 相同）。 当影片被切割为多段，且各文件中轨道数和轨道 ID 相同时，这将允许简单的追加合并，命令行为 mkvmerge -o 输出.mkv 第一段.mkv +第二段.mkv。
+ | 单个 '+' 将追加后面的文件，而不是添加。'+' 也可以直接放在下一个文件名的前面。因此以下两条命令等效:
    $ mkvmerge -o 完整.mkv 文件1.mkv + 文件2.mkv
    $ mkvmerge -o 完整.mkv 文件1.mkv +文件2.mkv
= | 通常情况下 mkvmerge(1) 将在输入文件所在的目录中查找基本名称相同，仅在连续的数字方面有差异的文件 (如 'VTS_01_1.VOB'、'VTS_01_2.VOB'、'VTS_01_3.VOB' 等等)，并将所有这些文件作为连接后的单个大文件对待。本选项，单个 '='，可令 mkvmerge 不查找这些额外的文件。 '=' 也可以放在下一个文件名的前面。因此以下两条命令等效:
    $ mkvmerge -o 完整.mkv = 文件1.mkv
    $ mkvmerge -o 完整.mkv =文件1.mkv

( 文件1 文件2 )

如果一对圆括号中包含多个文件名，这些文件将被当作连接起来的单个大文件对待，其内容为各文件顺序相连。

该功能可用于如 DVD 中的 VOB 文件，或是 MPEG 传输流。如果各文件有独立的头，常见的例子如独立的 AVI 或 MP4 文件，则不适用。

将文件名置于括号中还可以阻止 mkvmerge(1) 查找具有相同基名称的文件，如 = 选项 所述。因此下面两则命令行等效:

    $ mkvmerge -o 输出.mkv = 文件.mkv
    $ mkvmerge -o 输出.mkv '(' 文件.mkv ')'

应该注意的几件事:

1. 左括号后、右括号前均必须有空格。

2. 括号之间的所有参数都作为文件名解析。因此应用到此逻辑文件的所有选项都必须在左括号之前列出。

3. 一些 shell 会将括号作为特殊符号对待。因此您需要像上例这样进行转义或给它们加上引号。

## 2.6. 附件支持 (其他全局选项)

Option | Description
--- | ---
--attachment-description 描述 | 对后面附件的纯文字描述。将应用到下一个 --attach-file 或 --attach-file-once 选项。
--attachment-mime-type MIME 类型 | 后面附件的 MIME 类型。将应用到下一个 --attach-file 或 --attach-file-once 选项。 官方认可的 MIME 类型列表可以在如 IANA 主页 找到。MIME 类型对附件来说是必需的。
--attachment-name 名称 | 设置此附件将在输出文件中储存的名称。 如果未给出此选项则将由 --attach-file 或 --attach-file-once 选项所设的文件名推得。
--attach-file 文件名, --attach-file-once 文件名 | 在 Matroska(tm) 文件中创建文件附件。MIME 类型必须在使用此选项之前设定。两种形式的不同之处在于使用 --attach-file 附加的文件在切割过程中将被附加到所有输出文件中，而使用 --attach-file-once 附加的文件只被附加到创建的首个文件中。如果未使用切割功能，两种形式效果相同。 可以使用 mkvextract(1) 从 Matroska(tm) 文件中提取附件文件。

## 2.7. 用于各输入文件的选项

Option | Description
--- | ---
-a, --audio-tracks [!]n,m,... | 复制 n、m 等音频轨。数字是可以通过 --identify 开关获取的轨道 ID。他们不只是简单的轨道序号（参见 轨道 ID段落）。默认: 复制所有音频轨道。 如果 ID 以 ! 作为前缀，则含义相反: 复制除了列在 ! 后面的 ID 以外的所有轨道。
-d, --video-tracks [!]n,m,... | 复制 n、m 等视频轨。数字是可以通过 --identify 开关获取的轨道 ID。他们不只是简单的轨道序号（参见 轨道 ID段落）。默认: 复制所有视频轨道。 如果 ID 以 ! 作为前缀，则含义相反: 复制除了列在 ! 后面的 ID 以外的所有轨道。
-s, --subtitle-tracks [!]n,m,... | 复制 n、m 等字幕轨。数字是可以通过 --identify 开关获取的轨道 ID。他们不只是简单的轨道序号（参见 轨道 ID段落）。默认: 复制所有字幕轨道。 如果 ID 以 ! 作为前缀，则含义相反: 复制除了列在 ! 后面的 ID 以外的所有轨道。
-b, --button-tracks [!]n,m,... | 复制 n、m 等按钮轨。数字是可以通过 --identify 开关获取的轨道 ID。他们不只是简单的轨道序号（参见 轨道 ID段落）。默认: 复制所有按钮轨道。 如果 ID 以 ! 作为前缀，则含义相反: 复制除了列在 ! 后面的 ID 以外的所有轨道。
--track-tags [!]n,m,... | 复制 n、m 等轨道的标签。数字是可以通过 --identify 开关获取的轨道 ID。他们不只是简单的轨道序号（参见 轨道 ID段落）。默认: 复制所有轨道的标签。 如果 ID 以 ! 作为前缀，则含义相反: 复制除了列在 ! 后面的 ID 以外的所有轨道。
-m, --attachments [!]n[:all|first],m[:all|first],... | 复制 ID 为 n、m 等的附件到所有或者仅首个输出文件中。各 ID 后可接 ':all'（如果两可选数值均未输入，此为默认值）或者 ':first'。如果切割功能已被起用，则 ID 被指定为 ':all' 的附件将被复制到所有生成的输出文件中，而其他附件只被复制到首个输出文件中。如果未使用切割功能则两变量等效。 默认复制所有附件到所有输出文件中。 如果 ID 以 ! 作为前缀，则含义相反: 复制除了列在 ! 后面的 ID 以外的所有轨道。
-A, --no-audio | 不要从此文件中复制任何音频轨。
-D, --no-video | 不要从此文件中复制任何视频轨。
-S, --no-subtitles | 不要从此文件中复制任何字幕轨。
-B, --no-buttons | 不要从此文件中复制任何按钮轨。
-T, --no-track-tags | 不要从此文件中复制任何轨道细节标签。
--no-chapters | 不要从此文件中复制章节。
-M, --no-attachments | 不要从此文件中复制附件。
--no-global-tags | 不要从此文件中复制全局标签。
--chapter-charset 字符集 | 设置源文件中章节信息的字符集，以供转为 UTF-8 之用。关于 mkvmerge(1) 如何在字符集之间进行转换的说明，请参阅下文 文本文件与字符集 段落。
--chapter-language 语言代码 | 选择各章节项所用的 ISO639-2 语言代码。 此选项可用于包含章节但不含关于章节语言的信息的源文件，如 MP4 与 OGM 文件。
-y, --sync TID:d[,o[/p]] | 将 id 为 TID 的轨道的时间码按 d ms 进行调整。轨道 ID 与 --identify 所给出的相同 (参见 轨道 ID 段落)。 o/p: 按 o/p 调整时间戳以修复线性偏移。如果省略 p 则默认为 1。o 与 p 均可为浮点数。 默认: 无手动同步校正 (与 d = 0 及 o/p = 1.0 效果相同)。 此选项可以对同一输入文件多次使用，通过每次选择不同轨道 ID 分别应用到多个轨道。
--cues TID:none|iframes|all | 控制为指定轨道 (参阅 轨道 ID 段落) 创建何种 cue 索引。'none（无）' 将阻止 cue 索引的创建。 而 'iframes（仅 i 帧）' 表示仅将没有前后参考的块 ( = 视频轨道中的 I 帧) 置于 cue 索引项中。'all（全部）' 将使 mkvmerge(1) 为所有区块创建索引，会使生成的文件非常大。 默认视频轨为 'iframes（仅 i 帧）'，其他所有轨道均为 'none（无）'. 参见不论是否使用 --cues 选项时都能阻止创建 cue 索引项的 --no-cues 选项。 此选项可以对同一输入文件多次使用，通过每次选择不同轨道 ID 分别应用到多个轨道。
--default-track TID[:bool] | 当为设定可选变量 bool 时为指定轨道 (参见 轨道 ID 段落) 设置 '默认轨' 标记。 当用户未明确选定一个轨道时，播放器将优先选用设有 '默认轨' 标记的轨道。各类 (音频、视频、字幕、按钮) 轨道只能有一条设置 '默认轨' 标记。 如果用户希望所有轨道都不被设置默认轨标记，可以将所有轨道的 bool 设为 0。 此选项可以对同一输入文件多次使用，通过每次选择不同轨道 ID 分别应用到多个轨道。
--forced-track TID[:bool] | 若未给出可选参数 bool，则为指定轨道 (参见 轨道 ID 段落) 设置“强制轨”标记。播放器必须播放“强制轨”标记为 1 的所有轨道。 此选项可以对同一输入文件多次使用，通过每次选择不同轨道 ID 分别应用到多个轨道。
--blockadd TID:层级 | 只保留选定轨道中高达 层级 层级的 BlockAdditions 附加块。 默认保留所有层级。 此选项只影响特定类型的编解码器，如 WAVPACK4。
--track-name TID:名称 | 将指定轨道 (参见 轨道 ID 段落) 的轨道名称设为 名称。
--language TID:语言 | 为指定轨道 (参见 轨道 ID) 设置语言。允许使用 ISO639-2 语言代码与 ISO639-1 国家代码。国家代码将被自动转换为语言代码。 可以使用 --list-languages 选项列出所有语言以及它们的 ISO639-2 代码。 此选项可以对同一输入文件多次使用，通过每次选择不同轨道 ID 分别应用到多个轨道。
-t, --tags TID:文件名 | 从文件 文件名 读取轨道号为 TID 的轨道的标签。详情参见下文 标签 段落。
--aac-is-sbr TID[:0|1] | 告诉 mkvmerge(1) ID 为 TID 的轨道是 SBR AAC (亦作 HE-AAC 或 AAC+)。下述情况下需要此选项：a) 源文件是 AAC 文件 (不是 Matroska(tm) 文件) 且 b) 该 AAC 文件含有 SBR AAC 数据。 设置此开关的原因是目前技术上无法在不解码一个完整的 AAC 帧的情况下自动分辨普通的 AAC 数据与 SBR AAC 数据。由于 AAC 解码器的诸多专利问题，mkvmerge(1) 永远不会包含此解码层。因此此开关对于 SBR AAC 文件是必需的。如果忽略了此开关，生成的文件可能无法正常回放，甚至可能根本无法播放。 如果源文件是 Matroska(tm) 文件，则已有足够侦测 SBR AAC 的 CodecID 了。然而，如果 CodecID 标注错误，此开关可用于更正之。 如果 mkvmerge 错将 AAC 文件侦测为 SBR，您可以将 ':0' 添加到轨道 ID。
--timecodes TID:文件名 | 从 文件名 读取要应用到指定轨道 ID 的时间码。 这些时间码将强制覆盖 mkvmerge(1) 默认计算出的时间码。参阅关于 外部时间码文件 的章节。
--default-duration TID:x | 强制指定轨道的默认时长为指定数值。 将同时修改轨道的时间码以匹配该默认时长。 变量 x 必须有 's', 'ms', 'us', 'ns', 'fps', 'p' 或 'i' 作为后缀，分别以秒、毫秒、微秒、纳秒、“帧每秒”、“逐行帧每秒”或“隔行帧每秒”为单位指定默认时长。数字 x 本身可为浮点数或分数。 如果未强制指定默认时长，mkvmerge 将尝试继承容器中（及/或特定轨道类型，如 AVC/h.264 或 MPEG-2 已编码的位流中）该轨道的默认时长。 此选项也可用于在不使用外部时间码文件的情况下更改视频轨的 FPS（帧率）。
--nalu-size-length TID:n | 强制 NALU 长度为 n 字节。 此变量仅当使用 AVC/h.264 基本流分包器时使用。 如果留空，则默认为 4 字节，然而有的文件包含的所有帧或切片都小于 65536 字节。 对此类文件您可以使用此参数并将长度降为 2。
--compression TID:n | 选择用于该轨道的压缩方式。注意播放器也得支持该方式。有效的值有 'none（无压缩）'、'zlib'、'lzo'/'lxo1x'、'bz2'/'bzlib' 与 'mpeg4_p2'/'mpeg4p2'。值 'lzo'/'lxo1x' 与 'bz2'/'bzlib' 仅当 mkvmerge(1) 分别附加相应的 liblzo(tm) 和 bzlib(tm) 压缩库编译时有效。 压缩方式 'mpeg4_p2'/'mpeg4p2' 是一种称为 '去头' 的特殊压缩方式，只对 MPEG4 part 2 视频轨可用。 部分字幕轨的默认值为 'zlib' 压缩。此压缩方式也是大部分（如果不是所有）回放应用程序都支持的压缩方式。无法保证对除 'none（无压缩）' 以外的其他压缩方式的支持。

## 2.8. 仅用于视频轨的选项

Option | Description
--- | ---
-f, --fourcc TID:FourCC | 强制 FourCC 为指定值。仅对 '微软兼容模式' 的视频轨有效。
--display-dimensions TID:宽度x高度 | Matroska(tm) 文件含有两个设定播放器回放时应当将画面缩放到的显示属性值: 显示宽度与显示高度。 可以使用本选项设定这些数值，如 '1:640x480'。 指定所用数值的其他方法是使用 --aspect-ratio 或 --aspect-ratio-factor 选项 (参见下文)。 这些选项是互相独立的。
--aspect-ratio TID:宽高比|宽度/高度 | Matroska(tm) 文件含有两个设定播放器回放时应当将画面缩放到的显示属性值: 显示宽度与显示高度。 通过本选项 mkvmerge(1) 可自动根据画面原始宽高和本选项给定的宽高比计算出显示宽度和显示高度。 宽高比可以以浮点数 宽高比 或分数 '宽度/高度' 的形式给出，如 '16/9'。 指定所用数值的其他方法是使用 --aspect-ratio-factor 或 --display-dimensions 选项 (参见上下文)。这些选项相互独立。
--aspect-ratio-factor TID:系数|n/d | 另一种设置宽高比的方法是指定一个 系数。将将原始宽高比与 系数 相乘后用作目标宽高比。 指定所用数值的其他方法是使用 --aspect-ratio 或 --display-dimensions 选项 (参见上文)。这些选项互相独立。
--cropping TID:左,上,右,下 | 将视频轨道的像素裁减参数设为指定数值。
--stereo-mode TID:n|关键词 | 设置轨道 ID 为 TID 的轨道的立体模式。 模式可以为介于 0 与 14 的数字 n 或这些关键词之一: 'mono'、'side_by_side_left_first'、'top_bottom_right_first'、'top_bottom_left_first'、'checkerboard_right_first'、'checkerboard_left_first'、'row_interleaved_right_first'、'row_interleaved_left_first'、'column_interleaved_right_first'、'column_interleaved_left_first'、'anaglyph_cyan_red'、'side_by_side_right_first'、'anaglyph_green_magenta'、'both_eyes_laced_left_first'、'both_eyes_laced_right_first'。

## 2.9. 仅适用于文本字幕轨道的选项

Option | Description
--- | ---
--sub-charset TID:字符集 | 为指定轨道 ID 指定所用字符集，用以转为 UTF-8 编码的 UTF-8 字幕。如果未指定字符集，则将根据当前区域设置推算字符集。注意对于从 Matroska(tm) 文件或 Kate 流中读取的字幕不必指定字符集，因为在这些格式中已使用 UTF-8 编码储存。关于 mkvmerge(1) 如何在字符集间进行转换的说明请参见关于 文本文件与字符集 的段落。 此选项可以对同一输入文件多次使用，通过每次选择不同轨道 ID 分别应用到多个轨道。

## 2.10. 其他选项

Option | Description
--- | ---
-i, --identify 文件名 | 将使 mkvmerge(1) 探查单个文件并报告其类型、文件中包含的轨道及其轨道 ID。如果使用了本选项，唯一可用的其他选项就是文件名。
-I, --identify-verbose 文件名 | 将使 mkvmerge(1) 探查单个文件并报告其类型、文件中包含的轨道及其轨道 ID。如果使用了本选项，唯一可用的其他选项就是文件名。 此选项可让 mkvmerge(1) 输出关于容器及其中的轨道的额外信息。额外信息由方括号围绕。它包含空格分隔的键/值对，其中键与值由冒号分隔。 各值按 关于文本中特殊字符的转义的段落 中描述的规则转义。
-l, --list-types | 列出受支持的输入文件类型。
--list-languages | 列出所有语言及其 ISO639-2 代码，这些代码可以在 --language 选项中使用。
--priority 优先级 | 设置 mkvmerge(1) 运行时的进程优先级。有效的值为 'lowest（最低）', 'lower（较低）', 'normal（普通）', 'higher（较高）' 与 'highest（最高）'。如果未予设定，则使用 'normal（普通优先级）'。在 类-Unix 系统中 mkvmerge(1) 将使用 nice(2) 功能。因此只有超级用户才能使用 'higher（较高优先级）' 与 'highest（最高优先级）'。对于 Windows 用户来说所有值都可用。
--command-line-charset 字符集 | 设定在命令行给出的字符串的字符集，用于转为其他字符集。默认为系统当前区域设置中所给定的字符集。此设置将应用到以下选项的变量: --title、--track-name 及 --attachment-description。
--output-charset 字符集 | 设置输出的字符串应被转换到何种字符集。默认为系统当前区域设置中所给定的字符集。
-r, --redirect-output 文件名 | 将所有信息输出至文件 文件名 而不是在命令行显示。 尽管该操作可以用输出重定向轻松实现，但在某些情况下还需要靠它：如当终端在写入文件之前重新解释（覆盖输出）时。 将优先使用通过 --output-charset 设定的字符集。
--ui-language 语言代码 | 强制使用语言代码为 语言代码 的翻译（如 'de_DE' 对应德文翻译）。使用 LANG, LC_MESSAGES 及 LC_ALL 这些环境变量更好。如果在 语言代码 处输入 'list'，mkvmerge(1) 将输出可用翻译列表。
--debug 主题 | 为特定功能开启调试。该选项仅对开发者有用。
--engage 功能 | 开启实验性功能。可用功能列表可通过 mkvmerge --engage list 得到。这些功能在正常情况下不应该使用。
@选项文件 | 从文件 选项文件 读取其他命令行参数。更多信息请参见关于 选项文件 的段落。
--capabilities | 列出编译时附加的可选功能并退出。输出信息的第一行是版本信息。接下来的每行包含一个单词，各单词的出现意味着编译时附加了相应功能。这些功能包括： 'BZ2' -- bzlib(tm) 压缩库。影响 --compression 选项可用的压缩方式。 'LZO' -- lzo(tm) 压缩库。影响 --compression 选项可用的压缩方式。 'FLAC' -- 读取原始 FLAC 文件，以及处理其他容器中的 FLAC 轨道，例如 Ogg(tm) 或 Matroska(tm) 容器中的。
-h, --help | 显示用法信息并退出。
-V, --version | 显示版本信息并退出。
--check-for-updates | 联机下载 URL http://mkvtoolnix-releases.bunkus.org/latest-release.xml 检查新版本。将以 键=值 的样式输出四行: 检索信息的 URL（键 version_check_url），当前运行的版本（键 running_version），最新版本（键 available_version）及其下载 URL（键 download_url）。 若无更新版本可用，程序将以退出码 0 退出，若有更新版本可用，退出码为 1，若出现错误（如无法检索更新信息），退出码则为 2。 此选项仅当程序附带 libcurl 支持编译时可用。

# 3. 用法

用户可以选择各文件中 mkvmerge(1) 应该使用的轨道。它们都将被封装到 -o所指定的文件中。可通过 -l 选项获取已知（且受支持的）来源格式列表。

Important:

命令行选项的顺序很重要。若您对程序还不熟悉，请阅读 "选项顺序" 段落。

# 4. 选项顺序

输入选项的顺序对一些选项很重要。选项可归为两类:

1. 影响整个程序的选项不与任何输入文件有关。这些选项包括但不限于 --command-line-charset、--output 或 --title。这些选项可在命令行的任意位置出现。

2. 影响单个输入文件或输入文件中的单个轨道的选项。这些选项均应用到命令行中接着的输入文件。所有应用到同一输入文件（或其轨道）的选项可以以任意顺序书写，只要都出现在该输入文件名之前。应用到输入文件的选项如 --no-chapters 或 --chapter-charset。应用到单个轨道的选项如 --default-duration 或 --language。

选项从左向右处理。如果同一个选项在同一范围内出现多次，将使用最后一次给出的参数。因此在下面的例子中，标题将被设为 "其他东东":

    $ mkvmerge -o 输出.mkv --title '这个内个' input.avi --title '其他东东'

下面的例子中可以两次使用 --language 选项，因为在不同范围内使用。尽管应用到同一轨道 ID，但应用到的是不同的输入文件，因此属于不同范围:

    $ mkvmerge -o 输出.mkv --language 0:fre 法语.ogg --language 0:deu 德语.ogg

# 5. 示例

假定您有个名为 我的影片.avi 的文件，以及分开存放的音频轨如 '我的影片.wav'。您希望先将音频编码为 OggVorbis(tm):

    $ oggenc -q4 -o 我的影片.ogg 我的影片.wav

几分钟后您就可以合并视频和音频了:

    $ mkvmerge -o 我的有声影片.mkv 我的影片.avi 我的影片.ogg

如果您的 AVI 文件已经含有一条音频轨，则将同时复制该轨道（只要 mkvmerge(1) 支持该音频格式）。要避免此状况，只需要这样

    $ mkvmerge -o 我的有声影片.mkv -A 我的影片.avi 我的影片.ogg

又过了几分钟，您又制作了另一条音频轨，如 导演评论或者是另一种语言的配音，您生成的文件名是 '我影片的另一音轨.wav'。 再进行一次编码操作，然后将其合并:

    $ oggenc -q4 -o我影片的另一音轨 我影片的另一音轨.wav
    $ mkvmerge -o 影片-成品.mkv 我的有声影片.mkv 我影片的另一音轨.ogg

照下面的做法结果相同

    $ mkvmerge -o 我的影片-成品.mkv -A 我的影片.avi 我的影片.ogg 我影片的另一音轨.ogg

现在开启 mplayer(tm) 尽情享受吧。如果您有多条音频轨（或者甚至是视频轨），那么您可以通过 '-vid' 与 '-aid' 选项告诉 mplayer(tm) 应该播放哪些轨道。这些是基础功能，不区分视频与音频。

如果您需要同步音频轨，会非常容易。首先找清 Vorbis 轨道的轨道 ID

    $ mkvmerge --identify 错开了的.ogg

现在您可以在下述命令行中使用该 ID:

    $ mkvmerge -o 同步了的.mkv -A 源.avi -y 12345:200 错开了的.ogg

这将在 '错开了的.ogg' 中 ID 为 12345 的音频轨的开头添加 200ms 的静音。

有些影片在开头同步正常，但音画同步会慢慢偏离开。对此类影片您可以指定延时系数，该系数将被应用到所有时间戳 -- 不添加或移除任何数据。因此如果您所设定的系数过大或过小会造成很糟糕的结果。例如我转码的一期节目有 77340 帧长，在结尾处有 0.2 秒的同步偏离。在 29.97fps 帧率下大约是每 6 帧错开 0.2 秒。于是我这样操作

    $ mkvmerge -o 同步了的.mkv -y 23456:0,77346/77340 错开了的.mkv

搞定了。

同步选项对字幕同样起作用。

对于文本字幕，您既可以选用一些 Windows 软件（如 SubRipper(tm)）或 'contrib/subrip' 目录 transcode(1) 的源码中的 subrip(tm) 包。大体过程是这样的:

1. 从源文件中提取原始字幕流:

       $ tccat -i /path/to/copied/dvd/ -T 1 -L | tcextract -x ps1 -t vob -a 0x20 | subtitle2pgm -o mymovie

2. 使用 gocr 将生成的 PGM 图像转为文本:

       $ pgm2txt mymovie

3. 对生成的文本文件进行拼写检查:

       $ ispell -d american *txt

4. 将文本文件转为 SRT 文件:

       $ srttool -s -w -i mymovie.srtx -o mymovie.srt

这样生成的文件可用作 mkvmerge(1) 的输入文件:

    $ mkvmerge -o mymovie.mkv mymovie.avi mymovie.srt

如果您希望为指定轨道指定语言，这将很容易完成。首先找到您所需语言的 ISO639-2 代码。mkvmerge(1) 会为您列出所有代码:

    $ mkvmerge --list-languages

在列表中找到您所需的语言。假定您已在 Matroska(tm) 文件中放入两条音轨，并希望设置它们的语言代码，两条轨道的轨道 ID 为 2 和 3。可以这样操作

    $ mkvmerge -o 含语言代码的.mkv --language 2:ger --language 3:dut 无语言代码的.mkv

如您所见，--language 开关可多次使用。

或许您还想让荷兰语作为默认语言。您还有其他语言的字幕，如英语和法语的，并希望让播放器默认显示法语字幕。可以这样操作

    $ mkvmerge -o 含语言代码的.mkv --language 2:ger --language 3:dut --default-track 3 无语言代码的.mkv --language 0:eng 英语.srt --default-track 0 --language 0:fre 法语.srt

如果您在 mkvinfo(1) 的输出信息中没找到您指定的语言或默认轨标记，请参阅关于 默认值 的段落。

关闭针对某输入文件的压缩。

    $ mkvmerge -o 无压缩.mkv --compression -1:none 我的影片.avi --compression -1:none 我的影片.srt

# 6. 轨道 ID

mkvmerge(1) 的一些选项要求提供轨道 ID 以指定应应用到的轨道。 当读取器分离当前输入文件时，或者使用 --identify 选项调用 mkvmerge(1) 时这些轨道 ID 会被显示出来。此类输出的一个示例：

    $ mkvmerge -i v.mkv
    文件 'v.mkv': 容器: Matroska
    Track ID 1: 视频 (V_MS/VFW/FOURCC, DIV3)
    Track ID 2: 音频 (A_MPEG/L3)

不要混淆输出 MKV 文件时所分派的轨道 ID与输入文件的轨道 ID。只有输入文件的轨道 ID 可用于需要轨道 ID 值的选项。

还需注意，每个输入文件有其自己的一组轨道 ID。因此通过 'mkvmerge --identify' 报告的文件 '文件1.扩展名' 的轨道 ID 不随其他输入文件的数量或 '文件1.扩展名' 所用到的位置变化。

轨道 ID 通常这样分配：

- AVI 文件: 视频轨 ID 为 0。音频轨的 ID 由 1 开始升序分配。

- AAC、AC3、MP3、SRT 与 WAV 文件: 此类文件中唯一的 '轨道' 的 ID 为 0。

- 大多数其他文件: 轨道 ID 按在文件中被找到的顺序由 0 开始分配。

特殊的轨道 ID '-1' 是个百搭号，它将使给定的开关应用到从输入文件中读到的所有轨道。

使用轨道 ID 的选项的描述中均含有 'TID'。此外下列选项也使用轨道 ID: --audio-tracks、--video-tracks、--subtitle-tracks、--button-tracks 以及 --track-tags。

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

Note:

此段落可应用到 MKVToolNix 中的所有程序，尽管该段仅提及了 mkvmerge(1)。

Matroska(tm) 文件中的所有文本均使用 UTF-8 编码。这意味着 mkvmerge(1) 需要将读取到的文本文件以及从命令行收到的文本从其他字符集转换为 UTF-8。相反，这意味着 mkvmerge(1) 的输出信息同样需要由 UTF-8 转回原来的字符集，例如来自 --ui-language 所选的非英语界面或来自 Matroska(tm) 文件中的文本。

mkvmerge(1) 根据是否有 字节顺序标记 (英文缩写: BOM) 出现以及系统的当前区域来进行自动转换。如何根据区域推定字符集取决于 mkvmerge(1) 所执行在的操作系统。

以 BOM 开头的文本文件已经使用一种 UTF 模式编码。mkvmerge(1) 支持以下五种模式: UTF-8、UTF-16 小端序 及 大端序、UTF-32 小端序 及 大端序。含 BOM 的文本文件将被自动转换为 UTF-8。对此类文件设定字符集的参数 (如 --sub-charset) 将被直接忽略，无通知。

在 类-Unix 系统 mkvmerge(1) 将使用 setlocale(3) 系统指令，它将返回环境变量 LANG、LC_ALL 及 LC_CYPE。输出的字符集通常是 UTF-8 或 ISO-8859-* 家族之一，将被用于所有文本文件操作以及编码命令行上的字符串和输出到命令行。

在 Windows 平台上，mkvmerge(1) 实际上使用两种不同的字符集，因为 Windows shell 程序 cmd.exe 的实现方式不同。第一个字符集通过调用 GetACP() 系统指令决定。此字符集用作文本文件转换和 MKVToolNix 工具包中 GUI 程序所显示的所有元素的默认字符集。

如果使用了 cmd.exe。则将使用其他字符集。然而，读取命令行所用的 GetCommandLineW() 函数返回的已经是 Unicode 字符串。因此 --command-line-charset 选项在 Windows 环境直接忽略。 输出到控制台由 WriteConsoleW() 函数完成。因此 Windows 平台下的 --output-charset 选项仅当输出信息通过 --redirect-output 重定向时才用到。

现有下述选项支持指定字符集:

- --sub-charset 用于文本字幕文件以及存储于字符集含糊的容器格式（如 Ogg 文件）中的文本字幕轨,

- --chapter-charset 用于章节文本文件以及存储于字符集含糊的容器格式（如 Ogg 文件的章节信息，轨道和文件标题等；MP4 文件的章节信息）中的章节和文件标题,

- --command-line-charset 用于所有命令行上的字符串,

- --output-charset 用于输出到命令行或文件（当使用 --redirect-output 选项重定向输出时）的字符串。

# 8. 选项文件

mkvmerge(1) 可从选项文件中读取额外的命令行参数。这样可以规避 shell 或操作系统在执行外部程序时的特定限制，如命令行长度的限制。

选项文件的处理有一些规则。首个非空白字符为井号 ('#') 的行将被当作注释对待，在处理过程中将被忽略。各行开头与结尾的空白将被除去。各行必须恰好仅含一个选项。

不包含任何内容的行也会被忽略。空参数用 #EMPTY# 独占一行表示。

有些字符可以转义，如当您需要使用 '#' 作为一个不是评论的行的开头。规则在关于转义文本的段落有描述。

注意反斜杠必须转义。井号 ('#') 如果不作为注释标记，也必须转义。

命令行 'mkvmerge -o "我的文件.mkv" -A "一部影片.avi" 声音.ogg' 可以转换为下述选项文件:

    # 写入 Windows 平台的 "c:\Matroska\我的文件.mkv" 文件。
    -o
    c:\\Matroska\\我的文件.mkv
    # 设置标题为 '#65'。
    --title
    \h65
    # 只需要 "一部影片.avi" 中的视频。
    -A
    一部影片.avi
    声音.ogg

# 9. 文本中特殊字符的转义

有时文本中的特殊字符必须或应该转义。转义规则很简单: 用反斜杠后接一字符替换需要转义的各字符。

规则为: ' ' (空格) 变为 '\s'、'"' (双引号) 变为 '\2'、':' 变为 '\c'、'#' 变为 '\h'，而 '\' (单个反斜杠) 自己则变为 '\\'。

# 10. Subtitles

可在 Matroska(tm) 文件中嵌入多种文本和位图字幕格式。文本字幕必须重新编码为 UTF-8 以确保播放器能准确显示（关于 mkvmerge(1) 如何在字符集间进行转换的说明请参见关于 文本文件与字符集 的段落）。Kate 字幕已经是 UTF-8 编码，不需要重新编码。

目前支持以下字幕格式:

- Subtitle Ripper (SRT) 文件

- Substation Alpha (SSA) / 高级 Substation Alpha 脚本 (ASS)

- 通用字幕格式 (USF) 文件

- OggKate 流

- VobSub 位图字幕文件

- BluRay 光盘中的 PGS 位图字幕文件

# 11. 文件链接

Matroska(tm) 支持文件链接，即声明当前文件的前趋与后继文件是哪个文件。严谨地讲，被连接的不是文件而是 Matroska(tm) 剪辑。鉴于大多数文件只含有一个 Matroska(tm) 剪辑，以下说明中将使用术语 '文件链接'，尽管 '剪辑链接' 更为贴切。

各剪辑由唯一的 128 位宽的剪辑 UID 确定。此 UID 是由 mkvmerge(1) 自动创建的。链接主要通过将前后文件的剪辑 UID (英文缩写: SID) 置于剪辑头部信息中完成。mkvinfo(1) 会在找到 SID 时输出它们。

如果文件被切割为多段，且启用了链接功能，则文件的时间码不会重新从 0 开始，而是会从上一个文件结束的地方继续计算。这样可以保留绝对时间，即使之前的文件不可用 (如进行流式处理时)。如果未使用链接功能，各文件的时间码应从 0 开始。mkvmerge(1) 默认不启用文件链接。如果您希望启用，可以通过 --link 选项打开。此选项仅当同时启用切割功能时有用。

无论是否开启了切割功能，用户都可以让 mkvmerge(1) 将生成的文件与指定的 SID 建立链接。可通过 --link-to-previous 与 --link-to-next 选项实现。 这些选项只接受 mkvinfo(1) 所输出的剪辑 SID 格式: 16 个 0x00 与 0xff 之间的十六进制数，各数字带有 '0x' 前缀，如 '0x41 0xda 0x73 0x66 0xd9 0xcf 0xb2 0x1e 0xae 0x78 0xeb 0xb4 0x5e 0xca 0xb3 0x93'。还可以选用另一种较短的格式: 16 个 0x00 与 0xff 之间的十六进制数，无 '0x' 前缀，无空格，如 '41da7366d9cfb21eae78ebb45ecab393'。

如果启用了切割功能，第一个文件将与通过 --link-to-previous 给定的 SID 建立链接，而最后一个文件将与通过 --link-to-next 给定的 SID 建立链接。如果未启用切割功能，唯一的输出文件将同时与给定的两个 SID 建立链接。

# 12. 默认值

Matroska(tm) 规范提到，一些元素有其默认值。通常为了节省空间，如果一个元素的值等同于其默认值，它将不被写入文件。用户在 mkvinfo(1) 的输出信息中可能发现缺失的元素有 语言 和 默认轨标记。 语言 的默认值是 English ('eng')，默认轨标记 的默认值是 true。因此如果您对一条轨道应用选项 --language 0:eng ，它将不在 mkvinfo(1) 的输出信息中显示。

# 13. 附件

或许您希望将一些照片与您的 Matroska(tm) 文件一起存放，或者您正在使用 SSA 字幕，需要一个非常稀有的特殊 TrueType(tm) 字体。这种情况下您可以将这些文件附加到 Matroska(tm) 文件中。它们不会被追加到文件当中，而是被嵌入到文件中。然后播放器就可以显示这些文件 (如 '照片' 一例) 或者用它们来渲染字幕 (如 'TrueType(tm) 字体' 一例)。

这是关于如何在输出文件中附加照片和 TrueType(tm) 字体的示例:

    $ mkvmerge -o 输出.mkv -A 视频.avi 声音.ogg \
      --attachment-description "乐队与我在后台小聚" \
      --attachment-mime-type image/jpeg \
      --attach-file 乐队与我.jpg \
      --attachment-description "难得一见的绝美字体" \
      --attachment-type application/octet-stream \
      --attach-file 很酷的字体.ttf

如果含有附件的 Matroska(tm) 文件被用作输入文件，mkvmerge(1) 会将附件复制到新文件中。要复制哪些文件、不复制那些文件的选择可以通过 --attachments 与 --no-attachments 选项修改。

# 14. 章节

Matroska(tm) 章节系统比大家知道的旧系统—— OGM 中所使用的——更为强大。完整的规范可以在 Matroska 网站 找到。

mkvmerge(1) 支持输入两种章节文件。第一种格式，叫作 '简单章节格式'，与 OGM tools 所用的相同。第二种是基于 XML 的章节格式，它支持 Matroska(tm) 的所有章节功能。

## 14.1. 简单章节格式

此格式由成对的相继以 'CHAPTERxx=' 与 'CHAPTERxxNAME=' 开头的行组成。单数行包含起始时间码，而双数行包含标题。这是一个示例：

    CHAPTER01=00:00:00.000
    CHAPTER01NAME=导入部分
    CHAPTER02=00:02:30.000
    CHAPTER02NAME=宝宝准备摇
    CHAPTER03=00:02:42.300
    CHAPTER03NAME=宝宝摇屋子

mkvmerge(1) 将转换每两行为一个 Matroska(tm) 章节单位（ChapterAtom）。这种情况不会设定任何 章节轨道号（ChapterTrackNumber），也就是说所有章节被应用到文件的所有轨道。

由于是文本文件，可能需要进行字符集转换。关于 mkvmerge(1) 如何在字符集间进行转换的说明请参见关于 文本文件与字符集 的段落。

## 14.2. 基于 XML 的章节格式

基于 XML 的章节格式看起来与这个示例类似：

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE Chapters SYSTEM "matroskachapters.dtd">
    <Chapters>
      <EditionEntry>
        <ChapterAtom>
          <ChapterTimeStart>00:00:30.000</ChapterTimeStart>
          <ChapterTimeEnd>00:01:20.000</ChapterTimeEnd>
          <ChapterDisplay>
            <ChapterString>短短的一节</ChapterString>
            <ChapterLanguage>chi</ChapterLanguage>
          </ChapterDisplay>
          <ChapterAtom>
            <ChapterTimeStart>00:00:46.000</ChapterTimeStart>
            <ChapterTimeEnd>00:01:10.000</ChapterTimeEnd>
            <ChapterDisplay>
              <ChapterString>那短短的一节的一部分</ChapterString>
              <ChapterLanguage>chi</ChapterLanguage>
            </ChapterDisplay>
          </ChapterAtom>
        </ChapterAtom>
      </EditionEntry>
    </Chapters>

使用此格式可以做到三件简单章节格式做不到的事:

1. 可以设置章节终止处的时间戳,

2. 章节可以嵌套,

3. 可以设置语言与国家。

mkvtoolnix 分发包的 doc 子目录包含了一些典型示例文件。

下面列出的是支持的 XML 标签，其数据类型及有效值域:

    Chapters (主)
      EditionEntry (主)
        EditionUID (无符号整数，有效值域: 1 <= 值)
        EditionFlagHidden (无符号整数，有效值域: 0 <= 值 <= 1)
        EditionFlagDefault (无符号整数，有效值域: 0 <= 值 <= 1)
        EditionFlagOrdered (无符号整数，有效值域: 0 <= 值 <= 1)
        ChapterAtom (主)
          ChapterAtom (主)
          ChapterUID (无符号整数，有效值域: 1 <= 值)
          ChapterTimeStart (无符号整数)
          ChapterTimeEnd (无符号整数)
          ChapterFlagHidden (无符号整数，有效值域: 0 <= 值 <= 1)
          ChapterFlagEnabled (无符号整数，有效值域: 0 <= 值 <= 1)
          ChapterSegmentUID (二进制，有效值域: 1 <= 长度，以字节为单位)
          ChapterSegmentEditionUID (无符号整数，有效值域: 1 <= 值)
          ChapterPhysicalEquiv (无符号整数)
          ChapterTrack (主)
            ChapterTrackNumber (无符号整数，有效值域: 1 <= 值)
          ChapterDisplay (主)
            ChapterString (UTF-8 字符串)
            ChapterLanguage (UTF-8 字符串)
            ChapterCountry (UTF-8 字符串)
          ChapterProcess (主)
            ChapterProcessCodecID (无符号整数)
            ChapterProcessPrivate (二进制)
            ChapterProcessCommand (主)
              ChapterProcessTime (无符号整数)
              ChapterProcessData (二进制)

## 14.3. 一般性备注

mkvmerge(1) 切割文件时会同时适当调整章节。这意味着每个文件只包含应用到该文件的章节项，时间码也将被调整到与各输出文件相匹配。

mkvmerge(1) 能够从 Matroska(tm) 源文件中复制章节，除非使用 --no-chapters 选项明令禁用。来自各类来源 (Matroska(tm) 文件、Ogg 文件、MP4 文件、章节文本文件) 的章节通常不被合并，而是分成多个 ChapterEditions（章节版本）。仅当从多个 Matroska(tm) 或 XML 文件读取的章节具有相同的版本 UID 时，章节才会被合并为单个 ChapterEdition。如果在其他情况下需要此类合并，用户需要先用 mkvextract(1) 从所有来源提取章节，手动合并 XML 文件然后再混流。

# 15. 标签

## 15.1. 介绍

Matroska(tm) 广泛支持废弃标签，还支持一种新式的、类似其他大多数容器使用的较简单的标签系统: KEY=VALUE。然而，在 Matroska(tm) 中这些标签也可以嵌套，KEY 与 VALUE 都是属于它们自身的元素。示例文件 example-tags-2.xml 展示了如何使用这个新系统。

## 15.2. 标签细述

Matroska(tm) 标签不会自动应用到整个文件上。它们可以应用到整个文件，还可以应用到文件的不同部分: 一个或多个轨道, 一个或多个章节, 甚至是两者的组合。Matroska 规范 有这方面的更多详情。

重要的一点是标签通过 Targets Matroska(tm) 标签元素与轨道或章节相连，而用于此链接的 UID 并非 mkvmerge(1) 常用的轨道 ID。而是 mkvmerge(1) 自动计算而来 (当轨道来自非 Matroska(tm) 文件时) 或当轨道源文件是 Matroska(tm) 文件时复制而来的 的 UID。因此在文件被 mkvmerge(1) 处理过之前很难知道应该在标签文件中使用哪些 UID。

mkvmerge(1) 支持两个为 Matroska(tm) 文件添加标签的选项: --global-tags 与 --tags 选项。不同之处在于前者，--global-tags，将通过移除上文提到的所有 Targets 元素使标签应用到整个文件。 而后者，--tags，将使 mkvmerge(1) 为通过 --tags 选项的 TID 部分指定的标签自动插入 UID。

## 15.3. 示例

假定您希望为从一个 AVI 文件读取的视频轨道添加标签。mkvmerge --identify 文件.avi 告诉您该视频轨道的 ID (不要将此 ID 与 UID 混淆!) 为 0。于是您创建了一个标签文件，省去了所有 Targets 元素，然后这样调用 mkvmerge(1):

    $ mkvmerge -o 文件.mkv --tags 0:标签.xml 文件.avi

## 15.4. 标签文件格式

mkvmerge(1) 支持基于 XML 的标签文件格式。此格式是以 Matroska 规范 为依据严格制定的。MKVToolNix 的程序以及源码分发包都含有名为 example-tags-2.xml 的示例文件，该文件已简明地列出了所有已知的可用作实际处理的基本标签。

基本要点有：

- 最外层的元素必须为 <Tags>。

- 实际意义上的标签放在 <Tag> XML 标签对中。

- 标签内容前后的空白将被忽略。

## 15.5. 数据类型

新的 Matroska(tm) 标签系统只识别两种数据类型，UTF-8 字串与二进制类型。前者用于标签名称和 <String> 元素，而二进制类型用于 <Binary> 元素。

由于二进制数据自身与 XML 文件不相容，mkvmerge(1) 支持另两种储存二进制数据的方法。如果 XML 标签的内容以 '@' 开头，则后续文本将被作为文件名对待。相应文件的内容将被复制到 Matroska(tm) 元素中。

还有一种可能，即数据经 Base64 编码。这是将二进制数据转换为一定的 ASCII 字集字符，在电子邮件等程序中有所应用。mkvextract(1) 将将二进制元素以 Base64 编码的数据的形式输出。

已被废弃的标签系统可识别更多的数据类型，这在 Matroska(tm) 官方的标签规范中可以找到。由于 mkvmerge(1) 不再支持此系统，此处不对这些类型作多余说明。

## 15.6. XML 文件格式的已知标签

下面列出的是支持的 XML 标签，其数据类型及有效值域:

    Tags (主)
      Tag (主)
        Targets (主)
          TargetTypeValue (无符号整数)
          TargetType (UTF-8 字符串)
          TrackUID (无符号整数)
          EditionUID (无符号整数)
          ChapterUID (无符号整数)
          AttachmentUID (无符号整数)
        Simple (主)
          Simple (主)
          Name (UTF-8 字符串)
          TagLanguage (UTF-8 字符串)
          DefaultLanguage (无符号整数)
          String (UTF-8 字符串)
          Binary (二进制)

# 16. 剪辑信息 XML 文件

可以通过剪辑信息 XML 文件设置 Matroska 文件 "剪辑信息" 头部字段的特定值。所有这些值都无法通过其他命令行选项设置。

还有一些 "剪辑信息" 头部字段可以通过命令行选项设置，而非通过 XML 文件。包括如 --title 及 --timecode-scale 选项。

还有其他元素既不能通过命令行选项，也不能通过 XML 文件设置。这些包括下述元素: DateUTC (即 "混流时间")、混流应用程序 MuxingApp、写入库 WritingApp 及 总时长 Duration。这些元素均由 mkvmerge(1) 自行设置。

下面列出的是支持的 XML 标签，其数据类型及有效值域:

    Info (主)
      SegmentUID (二进制，有效值域: 长度（字节） == 16)
      SegmentFilename (UTF-8 字符串)
      PreviousSegmentUID (二进制，有效值域: 长度（字节） == 16)
      PreviousSegmentFilename (UTF-8 字符串)
      NextSegmentUID (二进制，有效值域: 长度（字节） == 16)
      NextSegmentFilename (UTF-8 字符串)
      SegmentFamily (二进制，有效值域: 长度（字节） == 16)
      ChapterTranslate (主)
        ChapterTranslateEditionUID (无符号整数)
        ChapterTranslateCodec (无符号整数)
        ChapterTranslateID (二进制)

# 17. Matroska 文件规划

Matroska(tm) 文件规划非常灵活。mkvmerge(1) 将按预先定义的方式渲染文件。生成的文件是这样的：

[EBML 头] [剪辑 {元定位 #1} [剪辑信息] [轨道信息] {附件} {章节} [簇 1] {簇 2} ... {簇 n} {索引} {元定位 #2} {标签}]

大括号中的元素是可选的，依所用的内容和选项而定。有两点要注意的：

- 元定位 #1 只包含很少量的 level 1 元素，且仅当它们存在时才包含：附件、章节、索引、标签以及元定位 #2。较早版本的 mkvmerge(1) 亦曾将簇放置在元定位元素中。因此应留给不精确的传言一些空间——真相总会大白。 现在只有簇才被储存在元定位 #2 中，元定位 #1 将引用元定位元素 #2。

- 附件、章节和标签元素仅当被添加后才会出现。

允许的最短小的 Matroska 文件是像这样的：

[EBML 头] [剪辑 [剪辑信息] [轨道信息] [簇 1]]

这也是纯音频文件的样子。

# 18. 外部时间码文件

mkvmerge(1) 允许用户为各轨道选择特定的时间码。这可用来创建包含可变帧率视频或音频中有空隙的文件。这种情况下的帧是 mkvmerge(1) 创建各 Matroska(tm) 块的单位。对视频来说恰好是一帧，对音频来说是相应音频类型的一个数据包。例如对 AC3 来说是包含 1536 采样的一个数据包。

用于轨道追加合并的时间码必须只指定给一系列（同一）轨道的第一部分。例如当您追加合并两个文件，v1.avi 与 v2.avi，且希望使用时间码时，您的命令行必须像这样组织：

    $ mkvmerge ... --timecodes 0:我的时间码.txt v1.avi +v2.avi

mkvmerge(1) 可识别四种格式的时间码。版本号在时间码文件的第一行内。空行，只含有空格的行，以及以 '#' 开头的行在处理时将被忽略。

## 18.1. 时间码文件格式 v1

此格式的第一行是版本声明。第二行则声明默认的帧率。 接下来的各行包含由逗号分隔的三个数字: 起始帧（0 代表第一帧）、终止帧以及此范围内的帧率。FPS（帧率） 为浮点数，小数点用 '.' 表示。各行定义的范围间可以有间隔，间隔内将使用默认的 FPS。一个示例：

    # timecode format v1
    assume 27.930
    800,1000,25
    1500,1700,30

## 18.2. 时间码文件格式 v2

此格式中每行包含相应帧的时间码。此时间码必须以毫秒为精度。可以使浮点数，但不强求。您指定的时间码行数 必须 不少于对应轨道的帧数。此类文件中的时间码必须经过排序。 以 25fps 为例：

    # timecode format v2
    0
    40
    80

## 18.3. 时间码文件格式 v3

此格式中各行包含时长（秒数），后接（可选）帧率。 二者均可为浮点数。 如果未提供帧率，则采用默认的帧率。 对于音频，您应当让编解码器自行计算各帧的时间码。 这样您应当使用 0.0 作为帧率。 您可以使用 'gap' 关键词后接空隙时长在流中创建空隙。 以音频文件为例：

    # timecode format v3
    assume 0.0
    25.325
    7.530,38.236
    gap, 10.050
    2.000,38.236

## 18.4. 时间码文件格式 v4

此格式与 v2 格式相似。 唯一的不同在于时间码不必经过排序。 通常不应使用此格式。

# 19. 退出代码

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

- 0 -- 此退出代码说明已成功完成混流。

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

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

# 20. 环境变量

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

Option | Description
--- | ---
MKVTOOLNIX_DEBUG 及其缩写形式 MTX_DEBUG | 内容将被当作通过 --debug 选项传递的参数对待。
MKVTOOLNIX_ENGAGE 及其缩写形式 MTX_ENGAGE | 内容将被当作通过 --engage 选项传递的参数对待。
MKVTOOLNIX_OPTIONS 及其缩写形式 MTX_OPTIONS | 内容将在空白处切割。最终得到的字符串部分将按命令行选项的格式处理。如果您需要传递特殊字符 (如空白) 则需要转义 (参见关于转义文本中特殊字符的段落)。

# 21. 参阅

mkvinfo(1), mkvextract(1), mkvpropedit(1), mmg(1)

# 22. 网络

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