DOKK / manpages / debian 12 / mkvtoolnix / mkvmerge.1.zh_CN
MKVMERGE(1) 用户命令 MKVMERGE(1)

名称

mkvmerge - 将多媒体流合并为 Matroska 文件

概要

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

说明

本程序以任意数量的媒体文件作为输入文件,并将它们的数据流(全部或部分)合并到 Matroska 文件中去;参见 Matroska 网站[1]。


重要

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

全局选项

-v, --verbose

增强“详细”程度。

-q, --quiet

取消状态输出。

-o, --output 文件名

写至文件 文件名。如果使用了切割功能,对此参数的处理将有所不同。 详情请参阅关于 --split 选项的说明。

-w, --webm

创建符合 WebM 规范的文件。若输出文件的扩展名为 「webm」,则会自动开启本选项。此模式将实施一些限制。只允许使用编解码器为 VP8、VP9 的视频轨道及 Opus、Vorbis 的音频轨道。DocType 头部项目将改为 「webm」。

对于章节与标签,只允许使用一部分元素。mkvmerge(1) 将自动移除规范所不允许的元素。

--title 标题

设置整个生成文件的标题,比如电影名称。

--default-language 语言代码

设置默认语言代码,用于没有使用 --language 选项设置语言的轨道以及源容器未提供语言值的轨道。

默认的语言代码为「und」,即「undetermined」(未定)。

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

--segmentinfo 文件名.xml

从 XML 文件中读取剪辑信息。此文件可以包含剪辑族的 UID、剪辑的 UID、上一剪辑以及下一剪辑的 UID 元素。示例文件以及 DTD 已包含在 MKVToolNix 套件内。

详情请参见下文关于 剪辑信息 XML 文件 的段落。

--segment-uid SID1,SID2,...

设定要使用的剪辑 UID。这是个逗号分割的 128 位 UID 列表,UID 为通常的格式: 十六进制数字,"0x" 前缀可选,空格可选,但必须恰好有 32 个数位。

若 SID 以“=”开头,则其剩余部分将作为 Matroska 文件解析,将读取并使用该文件的剪辑 UID。

创建的每个文件都包含一个剪辑,每个剪辑有一个剪辑 UID。如果指定的剪辑 UID 比创建的剪辑多,则多余的 UID 将被忽略。如果指定的 UID 比创建的剪辑少,则将随机创建 UID。

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

--chapter-language 语言代码

设置各章节项的 ISO 639-2 语言代码。 默认为 'eng'。 详情参见下文中关于 章节 的段落。

此选项可用于简单章节文件与包含章节但不含章节语言信息的输入文件,如 MP4 与 OGM 文件。

本选项设置的语言也将用于 --generate-chapters 选项 所生成的章节。

--chapter-charset 字符集

设置简单章节文件的字符集,用于将其转换为 UTF-8。关于 mkvmerge(1) 如何转换不同字符集的说明,请参见关于文本文件与字符集的段落。

此开关亦可应用到从特定容器类型,如 Ogg/OGM 和 MP4 文件中复制而来的章节。 详情参见下文关于章节的段落。

--chapter-sync d[,o[/p]]

将章节的时间戳平移 d ms。您也可以使用 --sync 选项操作特殊轨道 ID -2 (参见 特殊轨道 ID 段落)。

o/p: 按 o/p 调整时间戳以修复线性偏移。如果省略 p 则默认为 1。op 均可为浮点数。

默认: 无手动同步校正 (与 d = 0o/p = 1.0 效果相同)。

此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。

--generate-chapters 模式

mkvmerge(1) 可以自动创建章节。目前支持下述两种模式:

•'when-appending'(追加文件时) – 文件开头为第一章,随后每追加一个文件便创建一个章节。

此模式同时支持「parts:」及「parts-frames:」两种切割模式。对于这些模式,每段新增的时间戳范围会生成一个新章节 (其起始时间戳带有「+」前缀)。


注意
mkvmerge(1) 要求存在视频轨或音频轨,方可确定新文件追加的时间。若混流一或多个视频轨,则将使用第一个轨道的参数。否则将使用第一个音频轨。

•'interval:指定时间' – 该模式根据 指定时间 所给出的固定时间间隔生成章节。参数的格式既可以为 HH:MM:SS.nnnnnnnnn 的形式,也可以为数字后接单位 's'、'ms' 或 'us'。

示例: --generate-chapters interval:45s

新章节的名称由选项 --generate-chapters-name-template 控制。语言通过 --chapter-language 设置,该选项必须出现在 --generate-chapters 之前。

--generate-chapters-name-template 模板

该选项设置 --generate-chapters 选项所生成的章节名称的名称模板。若未使用该选项,则将使用默认值 '第 <NUM:2> 章'。

模板中可以使用多个变量,这些变量将在生成章节时被实际值替代。字符串 '<NUM>' 将被章节号替代。字符串 '<START>' 将被章节的起始时间戳替代。

字符串 「<FILE_NAME>」 与 「'<FILE_NAME_WITH_EXT>」 只会在为追加文件生成章节时进行填充。 它们会被替换为追加文件的文件名,前者不含扩展名,后者包含扩展名。 注意,只会插入文件本身的名称(及扩展名),不会插入其目录名或盘符。

您可以以 '<NUM:位数>' 的形式指定章节编号的最少位数,如 '<NUM:3>'。最终的数字,若其位数小于指定位数,则将在开头补零。

您可以以 <START:格式>的形式控制起始时间戳的格式。若未给出格式,则默认为 '%H:%M:%S'。有效的格式代码包括:

•%h – 时

•%H – 时(两位)

•%m – 分

•%M – 分(两位)

•%s – 秒

•%S – 秒(两位)

•%n – 纳秒(九位)

•%<1-9>n – 纳秒,精度最高为九位 (如 %3n 代表三位)

--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 文件名

从文件 文件名 读取全局标签。详情参阅下文关于 标签 的段落。

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

--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 的数据。

尝试定位到特定帧的程序只能直接定位到簇,然后需要读取整个簇(来完成定位)。因此创建较大的簇将导致定位不精确或缓慢。

--clusters-in-meta-seek

告诉 mkvmerge(1) 在文件末尾创建包含所有簇的元定位元素。参阅关于 Matroska 文件规划 的段落。

--timestamp-scale 系数

强制时间戳缩放系数为 系数。有效值域为 1000..10000000 或特殊值 -1

通常 mkvmerge(1) 会使用数值 1000000,这样时间戳和时长的精度为 1ms。对于不包含视频轨但含有至少一条音频轨的文件,mkvmerge(1) 将自动选择一个时间戳缩放系数以使各轨的音频采样精度相同。这将引起更大的额外开销,但将允许更为精确的定位与提取。

如果使用了特殊值 -1,即使有视频轨,mkvmerge(1) 也将使用采样精度。

--enable-durations

为所有区块写入时长。这将增大文件尺寸,而且目前对播放器来说没有额外的好处。

--no-cues

mkvmerge(1) 不要创建或写入 cue 索引( 可类比作 AVI 文件中的索引)。没有索引的 Matroska 文件也能播放,但定位可能不精确且缓慢。仅当您确实强求空间或用作测试时使用此选项。请参阅可为各输入文件指定的 --cues 选项。

--no-date

默认情况下,mkvmerge(1) 会将剪辑信息中的「date」字段设为混流开始的日期与时间。通过此选项可以完全不写入该字段。

--disable-lacing

禁用所有轨道的紧缩。这将增加文件大小,尤其是当有很多音频轨时。此选项不供日常之用。

--disable-track-statistics-tags

通常 mkvmerge(1) 会为每条轨道写入特定的统计信息标签。若这类标签已存在,则将被覆盖。这些标签包括 BPSDURATIONNUMBER_OF_BYTESNUMBER_OF_FRAMES

启用本选项可阻止 mkvmerge(1) 写入这些标签或修改现有的同名标签。

--disable-language-ietf

mkvmerge(1) 通常会在轨道头部、章节以及标签中同时写入传统语言元素以及全新的 IETF BCP 47 语言元素。若使用此选项,则只会写入传统元素。

--normalize-language-ietf 模式

将 IETF BCP 47 语言标签规范化,支持「canonical」(最简式)、「extlang」(扩展语言子标签形式)以及「off」关闭模式。默认(不添加本选项)会规范化至最简式。

最简式模式下,所有存在推荐值(preferred value)的语言子标签都会被替换为推荐值。依规范会执行下述转换: 「zh-yue-jyutping」 转换为 「yue-jyutping」,「fr-FX」 转换为 「fr-FR」。

扩展语言子标签形式在最简式的基础上生成。所有存在扩展语言子标签(extended language subtag)的主要语言(primary language)都被替换为子标签对应的前缀加上该子标签。该规则将 「yue-jyutping」 转回传统的 「zh-yue-jyutping」 形式,但 「fr-FR」 不会发生变化,因为 「fr」 不属于扩展语言子标签。

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

--split 指令

在给定尺寸或时间之后切割输出文件。请注意,各轨道只能在关键帧之前的地方切割开来。因此实际切割点可能比用户指定的稍稍靠后些。

目前 mkvmerge(1) 支持以下模式:

1.按尺寸切割。

语法: --split [size:]d[k|m|g]

示例: --split size:700m 或者 --split 150000000

参数 d 可以以 'k'、'm' 或 'g' 结尾,分别说明尺寸的单位为 KB、MB 或 GB。 否则假定单位为字节。 当前输出文件达到此尺寸限制后将开始输出新的文件。

为兼顾兼容性,'size:' 前缀可以省略。

2.在一定时长后切割。

语法: --split [duration:]HH:MM:SS.nnnnnnnnn|ds

示例: --split duration:00:60:00.000 或 --split 3600s

此参数可以用 HH:MM:SS.nnnnnnnnn 的形式指定纳秒精度的时长,也可以是后接字母 's' 的指定秒数时长的数字 dHH 为小时数,MM 为分钟数,SS 为秒数,而nnnnnnnnn 为纳秒数。 小时数与纳秒数均可省略。 小数点后最多可以有九位。 当前输出内容的时长达到此限制后将开始输出新的输出文件。

为兼顾兼容性,'duration:' 前缀可以省略。

3.在指定时间戳后切割。

语法: --split timestamps:A[,B[,C...]]

示例: --split timestamps:00:45:00.000,01:20:00.250,6300s

参数 ABC 等等的格式与按时长切割模式(见上文)所用的格式相同。时间戳表以逗号分隔。 输入流达到当前切割点的时间戳后将创建新的输出文件。然后将使用所给定的下一个切割点。

'timestamps:' 前缀不得省略。

4.通过指定时间戳范围,保留特定部分,并丢弃其余部分。

语法: --split parts:起点1-终点1[,[+]起点3-终点2[,[+]起点3-终点3...]]

示例:

1.--split parts:00:01:20-00:02:45,00:05:50-00:10:30

2.--split parts:00:01:20-00:02:45,+00:05:50-00:10:30

3.--split parts:-00:02:45,00:05:50-

parts 模式可以告诉 mkvmerge(1) 保留特定时间戳范围,而丢弃其余部分。要保留的范围需要在 parts: 关键词后列出,以逗号隔开。各分段由起始及终止时间戳组成,格式与其他 --split 模式所能接受的相同 (如 00:01:20 与 80s 代表相同的时间戳)。

若起始时间戳留空,则默认为前一段的终止时间戳。若不存在前一段,则默认为文件开头 (参见示例 3)。

若终止时间戳留空,则默认为输入文件末尾,亦即告诉 mkvmerge(1) 保留其余部分 (参见示例 3)。

通常每一段都会写入新的文件。该行为也可以调整,以便将连续的分段写入同一个文件。要实现这种效果,用户可以在起始时间戳开头加上 + 前缀。这样可以告诉 mkvmerge(1) 不要创建新文件,而是将该分段写入与之前一段相同的文件当中。时间戳也会自动调整,确保即使输入文件中两分段不连续,输出文件中也不出现间隙。

例 1 中 mkvmerge(1) 会创建两个文件。第一个包含从 00:01:20 到 00:02:45 之间的内容。第二个文件包含从 00:05:50 到 00:10:30 之间的内容。

例 2 中 mkvmerge(1) 将只创建一个文件。该文件包含从 00:01:20 到 00:02:45 及从 00:05:50 到 00:10:30 的内容。

例 3 中 mkvmerge(1) 将创建两个文件。第一个包含从输入文件开头到 00:02:45 的内容。第二个文件将包含从 00:05:50 到输入文件结尾之间的内容。


注意
请注意,mkvmerge(1) 只在关键帧位置决定是否切割。每段切割区域的起始点与结束点均为关键帧。因此即使结束时间戳介于两个关键帧之间,mkvmerge(1) 也将继续输出帧,直到下一关键帧为止(不包括)。

5.通过指定帧/场序号范围,保留特定部分,并丢弃其余部分。

语法: --split parts-frames:起点1-终点1[,[+]起点2-终点2[,[+]起点3-终点3...]]

示例:

1.--split parts-frames:137-258,548-1211

2.--split parts-frames:733-912,+1592-2730

3.--split parts-frames:-430,2512-

parts-frames 模式可以告诉 mkvmerge(1) 保留特定帧/场序号范围,而丢弃其余部分。要保留的范围需要在 parts-frames: 关键词后列出,以逗号隔开。各分段由起始及终止帧/场序号组成。序号从 1 开始计数。

若起始序号留空,则默认为前一段的终止序号。若不存在前一段,则默认为文件开头 (参见示例 3)。

若终止序号留空,则默认为文件末尾,亦即告诉 mkvmerge(1) 保留其余部分 (参见示例 3)。

通常每一段都会写入新的文件。该行为也可以调整,以便将连续的分段写入同一个文件。要实现这种效果,用户可以在起始序号开头加上 + 前缀。这样可以告诉 mkvmerge(1) 不要创建新文件,而是将该分段写入与之前一段相同的文件当中。时间戳也会自动调整,确保即使输入文件中两分段不连续,输出文件中也不出现间隙。


注意
请注意,mkvmerge(1) 只在关键帧位置决定是否切割。每段切割区域的起始点与结束点均为关键帧。因此即使结束帧/场序号介于两个关键帧之间,mkvmerge(1) 也将继续输出帧,直到下一关键帧为止(不包括)。

例 1 中 mkvmerge(1) 会创建两个文件。第一个包含从第 137 帧或之后的第一个关键帧,到第 258 帧或之后的第一个关键帧(但不含该关键帧)之间的内容。第二个文件包含第 548 到 1211 帧之间的内容。

例 2 中 mkvmerge(1) 将只创建一个文件。该文件包含从 733 到 912 及从 1592 到 2730 的内容。

例 3 中 mkvmerge(1) 将创建两个文件。第一个包含输入文件开头到 430 的内容。第二个文件将包含从 2512 到输入文件结尾之间的内容。

该模式只考虑输出的第一条视频轨道。 如果没有输出视频轨道,则将不会进行切割操作。


注意
通过本参数给出的数字将根据输出的 Matroska 区块解析。 单个 Matroska 区块可包含完整的一帧 (对于逐行扫描的内容) 或单场 (对于隔行扫描的内容)。 mkvmerge 不区分两者,它直接统计区块数目。 例如: 假设某人希望在隔行扫描的第 25 个完整帧之后切割,则应使用 50 (每帧对应两场) 作为切割点。

6.在指定帧/场后切割。

语法: --split frames:A[,B[,C...]]

示例: --split frames:120,237,891

参数 ABC 等等必须全为正整数。编号从 1 开始。 帧/场编号列表以逗号分隔。 输入流达到当前切割点的帧/场编号后将创建新的输出文件。然后将使用所给定的下一个切割点。

'frames:' 前缀不得省略。

该模式只考虑输出的第一条视频轨道。 如果没有输出视频轨道,则将不会进行切割操作。


注意
通过本参数给出的数字将根据输出的 Matroska 区块解析。 单个 Matroska 区块可包含完整的一帧 (对于逐行扫描的内容) 或单场 (对于隔行扫描的内容)。 mkvmerge 不区分两者,它直接统计区块数目。 例如: 假设某人希望在隔行扫描的第 25 个完整帧之后切割,则应使用 50 (每帧对应两场) 作为切割点。

7.在指定章节之前切割。

语法: --split chapters:all or --split chapters:A[,B[,C...]]

示例: --split chapters:5,8

参数 ABC 等等必须全为正整数。编号从 1 开始。 章节编号列表以逗号分隔。 切割将在时间戳等于或大于所列编号对应章节的起始时间戳的首个关键帧之前进行。从 0s 开始的章节将不作考虑,并不作提示,直接丢弃。

关键词 all 可选择所有章节编号,无需手工输入。

'chapters:' 前缀不得省略。


注意
Matroska 文件格式支持任意深度嵌套的章节结构,称为“版本条目”与“章节单位”。 但该模式仅考虑所有版本条目中最顶层的章节。

此切割模式下输出文件名将以不同于常用操作的方式对待。可能会含有类似 printf 中 '%d' 的表达式,包括可选的字段宽度,如 '%02d'。如果含有上述表达式,当前文件序号将按相应格式生成,然后插入到文件名中的相应位置。 如果没有此类匹配模式,则假定匹配模式为在文件扩展名之前插入 '-%03d': '-o 输出.mkv' 将生成 '输出-001.mkv' 这样的一系列文件。如果没有扩展名,'-%03d' 将被追加在文件名之后。

也可以选用「%c」,它将被替换为文件中首个章节的名称。注意:当「%c」存在时,不会再自动添加「-%03d」。

--link

切割输出文件时连接文件。详情请参阅下文 文件链接 段落。

--link-to-previous 剪辑-UID

连接第一个输出文件到指定 剪辑-UID 参数对应的剪辑。详情请参阅下文 文件链接 段落。

若 SID 以“=”开头,则其剩余部分将作为 Matroska 文件解析,将读取并使用该文件的剪辑 UID。

--link-to-next 剪辑-UID

连接最后一个输出文件到指定 剪辑-UID 参数对应的剪辑。详情请参阅下文 文件链接 段落。

若 SID 以“=”开头,则其剩余部分将作为 Matroska 文件解析,将读取并使用该文件的剪辑 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

[ 文件1 文件2 ]

如果方括号内包含多个文件名,则从第二个文件开始的所有文件都将追加合并到括号中第一个文件后面。

这是用“+”连接文件名的另一种语法。因此下述两条命令是等效的:

$ mkvmerge -o 完整.mkv 文件1.mkv + 文件2.mkv
$ mkvmerge -o 完整.mkv '[' 文件1.mkv 文件2.mkv ']'

=

对特定类型的文件 (MPEG 节目流,即 VOB 文件) mkvmerge(1) 通常会去输入文件所在的目录寻找是否存在基本文件名一致、仅编号存在差异的文件 (例如「VTS_01_1.VOB」「VTS_01_2.VOB」「VTS_01_3.VOB」等) 并将所有文件视为互相串联的单个大文件。此选项——单个「=」——要求 mkvmerge 不要去寻找其他文件。

'=' 也可以放在下一个文件名的前面。因此以下两条命令等效:

$ mkvmerge -o 完整.mkv = 文件1.vob
$ mkvmerge -o 完整.mkv =文件1.vob

( 文件1 文件2 )

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

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

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

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

应该注意的几件事:

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

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

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

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

--attachment-description 描述

对后面附件的纯文字描述。将应用到下一个 --attach-file--attach-file-once 选项。

--attachment-mime-type MIME 类型

后面附件的 MIME 类型。将应用到下一个 --attach-file--attach-file-once 选项。 官方认可的 MIME 类型列表可以在如 IANA 主页[2] 找到。MIME 类型对附件来说是必需的。

如果没有指定附件的 MIME 类型,则会自动侦测其类型。

--attachment-name 名称

设置此附件将在输出文件中储存的名称。 如果未给出此选项则将由 --attach-file--attach-file-once 选项所设的文件名推得。

--attach-file 文件名, --attach-file-once 文件名

在 Matroska 文件中创建文件附件。MIME 类型必须在使用此选项之前设定。两种形式的不同之处在于使用 --attach-file 附加的文件在切割过程中将被附加到所有输出文件中,而使用 --attach-file-once 附加的文件只被附加到创建的首个文件中。如果未使用切割功能,两种形式效果相同。

可以使用 mkvextract(1) 从 Matroska 文件中提取附件文件。

--enable-legacy-font-mime-types

对于特定类型的字体附件,使用传统的 MIME 类型。例如,TrueType 字体的类型将标注为「application/x-truetype-font」而非「fonts/ttf」。

这将同时影响未手动指定 MIME 类型的新附件,以及现有的字体附件,其已存在的 MIME 类型将被重新映射至传统类型。

受影响的 MIME 类型如下:「font/sfnt」「font/ttf」「font/collection」将全部映射至「application/x-truetype-fonts」,「 font/otf」将被映射至「application/vnd.ms-opentype」。

用于各输入文件的选项

-a, --audio-tracks [!]n,m,...

复制 nm 等音频轨。数字是可以通过 --identify 开关获取的轨道 ID。他们不只是简单的轨道序号(参见 轨道 ID段落)。默认: 复制所有音频轨道。

除轨道 ID 以外,您还可以提供 ISO 639-2 语言代码。仅当输入文件的轨道包含语言标签时可用。

默认: 复制该类的所有轨道。

若 ID 以 ! 开头,则其意义相反: 复制该类的所有轨道,除了 ! 后面所列出的轨道。

-d, --video-tracks [!]n,m,...

复制 nm 等视频轨。数字是可以通过 --identify 开关获取的轨道 ID。他们不只是简单的轨道序号(参见 轨道 ID段落)。默认: 复制所有视频轨道。

除轨道 ID 以外,您还可以提供 ISO 639-2 语言代码。仅当输入文件的轨道包含语言标签时可用。

若 ID 以 ! 开头,则其意义相反: 复制该类的所有轨道,除了 ! 后面所列出的轨道。

-s, --subtitle-tracks [!]n,m,...

复制 nm 等字幕轨。数字是可以通过 --identify 开关获取的轨道 ID。他们不只是简单的轨道序号(参见 轨道 ID段落)。默认: 复制所有字幕轨道。

除轨道 ID 以外,您还可以提供 ISO 639-2 语言代码。仅当输入文件的轨道包含语言标签时可用。

若 ID 以 ! 开头,则其意义相反: 复制该类的所有轨道,除了 ! 后面所列出的轨道。

-b, --button-tracks [!]n,m,...

复制 nm 等按钮轨。数字是可以通过 --identify 开关获取的轨道 ID。他们不只是简单的轨道序号(参见 轨道 ID段落)。默认: 复制所有按钮轨道。

除轨道 ID 以外,您还可以提供 ISO 639-2 语言代码。仅当输入文件的轨道包含语言标签时可用。

若 ID 以 ! 开头,则其意义相反: 复制该类的所有轨道,除了 ! 后面所列出的轨道。

--track-tags [!]n,m,...

复制 nm 等轨道的标签。数字是可以通过 --identify 开关获取的轨道 ID。他们不只是简单的轨道序号(参见 轨道 ID段落)。默认: 复制所有轨道的标签。

如果 ID 以 ! 作为前缀,则含义相反: 复制除了列在 ! 后面的 ID 以外的所有轨道。

-m, --attachments [!]n[:all|first],m[:all|first],...

复制 ID 为 nm 等的附件到所有或者仅首个输出文件中。各 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

不要从此文件中复制全局标签。

-y, --sync TID:d[,o[/p]]

将 id 为 TID 的轨道的时间戳按 d ms 进行调整。轨道 ID 与 --identify 所给出的相同 (参见 轨道 ID 段落)。

o/p: 按 o/p 调整时间戳以修复线性偏移。如果省略 p 则默认为 1。op 均可为浮点数。

默认: 无手动同步校正 (与 d = 0o/p = 1.0 效果相同)。

此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。

--cues TID:none|iframes|all

控制为指定轨道 (参阅 轨道 ID 段落) 创建何种 cue 索引。'none(无)' 将阻止 cue 索引的创建。 而 'iframes(仅 i 帧)' 表示仅将没有前后参考的块 ( = 视频轨道中的 I 帧) 置于 cue 索引项中。'all(全部)' 将使 mkvmerge(1) 为所有区块创建索引,会使生成的文件非常大。

默认值为 'iframes(仅 i 帧)'(视频及字幕轨道)或 'none(无)'(音频轨道)。参见 --no-cues 选项,后者可阻止 cue 条目的创建,无论是否使用了 --cues 选项。

此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。

--default-track-flag TID[:布尔值]

若可选参数「布尔值」已设为 1 或不存在该数值,则为指定轨道 (参见「轨道 ID」段落) 设置「默认轨」标记。若输入容器未提供此信息,且用户未通过选项参数指定,即会设置该标记。

如果用户在播放时不明确选择一条轨道,播放器应选择已设有「默认轨」标记的轨道,同时也应考虑用户偏好设置,例如用户偏好的语言。

此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。

--track-enabled-flag TID[:布尔值]

将指定轨道的「轨道启用」标记 (参阅「轨道 ID」段落) 设为指定值 布尔值 (0 或1; 若不指定,则默认为 1)。 只要没有特别指定选项值,且输入容器也未提供此类信息,轨道均默认为启用状态。

只有设置了「轨道启用」标记的轨道才应作为播放器考虑播放的对象。

此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。

--forced-display-flag TID[:布尔值]

若可选参数「 布尔值」已设为 1 或不存在该数值,则为指定轨道设置「强制显示」标记 (参阅「轨道 ID」段落)。 此选项适用于包含屏幕显示文字或外语对白翻译的轨道。

此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。

--hearing-impaired-flag TID[:布尔值]

若可选参数「布尔值」已设为 1 或不存在该数值,则为指定轨道设置「听觉障碍」标记 (参阅「轨道 ID」段落)。 此标记适用于适合听觉障碍人士使用的轨道。

此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。

--visual-impaired-flag TID[:布尔值]

若可选参数「布尔值」已设为 1 或不存在该数值,则为指定轨道设置「视觉障碍」标记 (参阅「轨道 ID」段落)。 此标记适用于适合视觉障碍人士使用的轨道。

此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。

--text-descriptions-flag TID[:布尔值]

若可选参数「布尔值」已设为 1 或不存在该数值,则为指定轨道设置「文字描述」标记 (参阅「轨道 ID」段落)。 此标记适用于包含对视频内容的文字描述的轨道,它们适合视觉障碍人士通过文本转语音系统播放。

此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。

--original-flag TID[:布尔值]

若可选参数「布尔值」已设为 1 或不存在该数值,则为指定轨道设置「原始语言」标记 (参阅「轨道 ID」段落)。 此标记适用于与内容原始语言一致 (而非翻译) 的轨道。

此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。

--commentary-flag TID[:布尔值]

若可选参数「布尔值」已设为 1 或不存在该数值,则为指定轨道设置「评论」标记 (参阅「轨道 ID」段落)。 此标记适用于包含评论内容的轨道。

此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。

--blockadd TID:层级

对指定轨道只保留高达「层级」层级的「BlockAdditions」(附加块)。 默认保留所有层级。 此选项只影响特定类型的编解码器,如 WAVPACK4。

--track-name TID:名称

将指定轨道 (参见 轨道 ID 段落) 的轨道名称设为 名称

--language TID:语言

为指定轨道 (参见 轨道 ID) 设置语言。允许使用 ISO 639-2 语言代码与 ISO 639-1 国家代码。国家代码将被自动转换为语言代码。 可以使用 --list-languages 选项列出所有语言以及它们的 ISO 639-2 代码。

此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。

-t, --tags TID:文件名

从文件 文件名 读取轨道号为 TID 的轨道的标签。详情参见下文 标签 段落。

--aac-is-sbr TID[:0|1]

告诉 mkvmerge(1) ID 为 TID 的轨道是 SBR AAC (亦作 HE-AAC 或 AAC+)。下述情况下需要此选项:a) 输入文件是 AAC 文件 (不是 Matroska 文件) 且 b) 该 AAC 文件含有 SBR AAC 数据。 设置此开关的原因是目前技术上无法在不解码一个完整的 AAC 帧的情况下自动分辨普通的 AAC 数据与 SBR AAC 数据。由于 AAC 解码器的诸多专利问题,mkvmerge(1) 永远不会包含此解码层。因此此开关对于 SBR AAC 文件是必需的。如果忽略了此开关,生成的文件可能无法正常回放,甚至可能根本无法播放。

如果输入文件是 Matroska 文件,则已有足够侦测 SBR AAC 的 CodecID 了。然而,如果 CodecID 标注错误,此开关可用于更正之。

如果 mkvmerge 错将 AAC 文件侦测为 SBR,您可以将 ':0' 添加到轨道 ID。

--audio-emphasis TID:n|代号

为轨道 ID 为 TID 的音频轨设置增强算法。参数值可以是数字形式的 n (介于 016 之间的特定值),也可以是英文代号。所有有效的数值及其代号可通过「--list-audio-emphasis」 选项列出。

--reduce-to-core 轨道ID

有些音频编码的核心是有损的,但提供了可选的扩展来实现无损解码。该选项告诉 mkvmerge(1) 只复制核心部分,而不复制扩展部分。默认情况下,mkvmerge(1) 会复制全部内容。

目前只有 DTS 轨道受此选项影响。嵌入 AC-3 核心的 TrueHD 轨道以两个轨道的形式呈现,用户可以选择复制哪个轨道。DTS 无法采用这种方案,因为 HD 扩展部分不能单独解码 – 而 TrueHD 数据可以。

--remove-dialog-normalization-gain 轨道ID

部分音频编码包含告知解码器/播放器如何应用音量增益(通常是降低)的头部字段,从而实现对白正规化。此选项可让 mkvmerge(1)  修改相应头部字段,移除或减小增益。

目前只有 AC-3、DTS 与 TrueHD 轨道受此选项影响。

--timestamps TID:文件名

文件名 读取要应用到指定轨道 ID 的时间戳。 这些时间戳将强制覆盖 mkvmerge(1) 默认计算出的时间戳。参阅关于 外部时间戳文件 的章节。

--default-duration TID:x

强制指定轨道的默认时长为指定数值。 将同时修改轨道的时间戳以匹配该默认时长。 变量 x 必须有 's', 'ms', 'us', 'ns', 'fps', 'p' 或 'i' 作为后缀,分别以秒、毫秒、微秒、纳秒、“帧每秒”、“逐行帧每秒”或“隔行帧每秒”为单位指定默认时长。数字 x 本身可为浮点数或分数。

如果未强制指定默认时长,mkvmerge 将尝试继承容器中(及/或特定轨道类型,如 AVC/H.264 或 MPEG-2 已编码的位流中)该轨道的默认时长。

此选项也可用于在不使用外部时间戳文件的情况下更改视频轨的 FPS(帧率)。

--fix-bitstream-timing-information TID[:0|1]

通常 mkvmerge(1) 不会更改视频位流中存储的时间同步信息 (帧/场速率)。本选项可调整此信息,使之与容器的时间同步信息匹配。容器时间同步信息可从多个来源得到: 命令行指定 (参见 --default-duration 选项)、源容器或从位流得出。


注意
目前仅完成对 AVC/H.264 视频轨的实现。

--compression TID:n

选择用于轨道的压缩算法。请注意,播放器也需要支持该算法才能正常播放。有效的值有 'none(不压缩)'、'zlib' 以及 'mpeg4_p2'/'mpeg4p2'。

压缩方式 'mpeg4_p2'/'mpeg4p2' 是一种称为 '去头' 的特殊压缩方式,只对 MPEG4 part 2 视频轨可用。

部分字幕类型的默认压缩算法为 'zlib'。该算法也是大多数(如果不是所有)回放应用程序所支持的算法。无法保证对其他压缩算法的支持('none(不压缩)' 除外)。

仅用于视频轨的选项

-f, --fourcc TID:FourCC

强制 FourCC 为指定值。仅对 '微软兼容模式' 的视频轨有效。

--display-dimensions TID:宽度x高度

Matroska 文件含有两个设定播放器回放时应当将画面缩放到的显示属性值: 显示宽度与显示高度。 可以使用本选项设定这些数值,如 '1:640x480'。

指定所用数值的其他方法是使用 --aspect-ratio--aspect-ratio-factor 选项 (参见下文)。 这些选项是互相独立的。

--aspect-ratio TID:宽高比|宽度/高度

Matroska 文件含有两个设定播放器回放时应当将画面缩放到的显示属性值: 显示宽度与显示高度。 通过本选项 mkvmerge(1) 可自动根据画面原始宽高和本选项给定的宽高比计算出显示宽度和显示高度。 宽高比可以以浮点数 宽高比 或分数 '宽度/高度' 的形式给出,如 '16/9'。

指定所用数值的其他方法是使用 --aspect-ratio-factor--display-dimensions 选项 (参见上下文)。这些选项相互独立。

--aspect-ratio-factor TID:系数|n/d

另一种设置宽高比的方法是指定一个 系数。将将原始宽高比与 系数 相乘后用作目标宽高比。

指定所用数值的其他方法是使用 --aspect-ratio--display-dimensions 选项 (参见上文)。这些选项互相独立。

--cropping TID:左,上,右,下

将视频轨道的像素裁减参数设为指定数值。

--color-matrix-coefficients TID:n

设置视频从红绿蓝三原色衍生出亮度及色度值所用的矩阵系数。参数 n 是范围从 010 的整数。

有效的值及其含义如下:

0: GBR, 1: BT709, 2: unspecified, 3: reserved, 4: FCC, 5: BT470BG, 6: SMPTE 170M, 7: SMPTE 240M, 8: YCOCG, 9: BT2020 非恒定亮度, 10: BT2020 恒定亮度

--color-bits-per-channel TID:n

设置颜色通道编码位数。数值 0 表示位数未指定。

--chroma-subsample TID:水平,垂直

对 Cr 与 Cb 通道中未移除的像素,水平/垂直方向需要移除的像素数量。

例如: 对于色度抽样为 4:2:0 的视频,该参数应设为 TID:1,1

--cb-subsample TID:水平,垂直

对 Cb 通道中未移除的像素,水平/垂直方向需要移除的像素数量。该数值将与 --chroma-subsample 相加。

例如: 对于色度抽样为 4:2:1 的视频,参数 --chroma-subsample 应设为 TID:1,0,Cb 抽样应设为 TID:1,0

--chroma-siting TID:水平,垂直

设置色度在水平/垂直方向上如何抽样 (0: 未指定, 1: 顶部/左侧合并, 2: 对半)。

--color-range TID:n

设置色域裁剪 (0: 未指定, 1: 广播色域, 2: 完整色域 (无裁剪), 3: 由 MatrixCoefficients/TransferCharacteristics 指定)。

--color-transfer-characteristics TID:n

视频的传输特征。

有效的值及其含义如下:

0: 保留, 1: ITU-R BT.709, 2: 未指定, 3: 保留, 4: gamma 2.2 曲线, 5: gamma 2.8 曲线, 6: SMPTE 170M, 7: SMPTE 240M, 8: 线性, 9: 对数, 10: 对数平方根, 11: IEC 61966-2-4, 12: ITU-R BT.1361 扩展色域, 13: IEC 61966-2-1, 14: ITU-R BT.2020 10 位, 15: ITU-R BT.2020 12 位, 16: SMPTE ST 2084, 17: SMPTE ST 428-1; 18: ARIB STD-B67 (HLG)

--color-primaries TID:n

设置视频的颜色基准。

有效的值及其含义如下:

0: 保留, 1: ITU-R BT.709, 2: 未指定, 3: 保留, 4: ITU-R BT.470M, 5: ITU-R BT.470BG, 6: SMPTE 170M, 7: SMPTE 240M, 8: FILM, 9: ITU-R BT.2020, 10: SMPTE ST 428-1, 22: JEDEC P22 磷光体

--max-content-light TID:n

设置单个像素的最高亮度 (Maximum Content Light Level 最大内容亮度级别),单位为坎德拉每平方米 (cd/m²)。数值 n 应为非负整数。

--max-frame-light TID:n

设置单个完整帧的最高亮度 (Maximum Frame-Average Light Level 最大帧平均亮度级别),单位为坎德拉每平方米 (cd/m²)。数值 n 应为非负整数。

--chromaticity-coordinates TID:red-x,red-y,green-x,green-y,blue-x,blue-y

设置 CIE 1931 定义的红/绿/蓝色度坐标。

--white-color-coordinates TID:x,y

设置 CIE 1931 定义的白色色度坐标。

--max-luminance TID:浮点数

设置最高亮度,单位为坎德拉每平方米 (cd/m²)。数值应小于 9999.99。

--min-luminance TID:浮点数

设置最低亮度,单位为坎德拉每平方米 (cd/m²)。数值应小于 999.9999。

--projection-type TID:方式

设置要使用的视频投影方式。有效值包括:0 (方形投影), 1 (等距圆柱投影), 2 (立方面投影), 3 (网状投影)。

--projection-private TID:数据

设置仅用于特定投影方式的私有数据。数据格式为十六进制数字,可以有 "0x" 前缀,可以有空格。

--projection-pose-yaw TID:浮点数

设置投影的水平平面旋转(yaw,上下轴不动)。

--projection-pose-pitch TID:浮点数

设置投影的上下旋转(pitch,左右轴不动)。

--projection-pose-roll TID:浮点数

设置投影的垂直平面旋转(roll,前后轴不动)。

--field-order TID:n

设置轨道 ID 为 TID 的视频轨道的场序。场序必须为以下数字之一:

0: 逐行扫描; 1: 隔行扫描,顶场先显示,顶场先存储; 2: 未定场序; 6: 隔行扫描,底场先显示,底场先存储; 9: 隔行扫描,底场先显示,顶场先存储; 14: 隔行扫描,顶场先显示,底场先存储

--stereo-mode TID:n|代号

为轨道 ID 为 TID 的视频轨道设置立体模式。模式值可以是数字形式的 n(介于 014 之间)或英文代号。所有有效的数值及其代号可通过 「--list-stereo-modes」 选项列出。

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

--sub-charset TID:字符集

指定轨道 ID 对应的字符集,用于将字幕转换为 UTF-8 编码。如果未指定字符集,则将根据当前区域设置推算字符集。注意,对于从 Matroska 文件或 Kate 流中读取的字幕不必指定字符集,因为这些字幕总是以 UTF-8 编码存储。关于 mkvmerge(1) 如何转换不同字符集的说明,请参见关于文本文件与字符集的段落。

此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。

其他选项

-i, --identify 文件名

将使 mkvmerge(1) 探查单个文件并报告其类型、文件中包含的轨道及其轨道 ID。如果使用了本选项,唯一可用的其他选项就是文件名。

结果的输出格式可以通过 --identification-format 选项修改。

-J 文件名

等同于“--identification-format json --identify 文件名”的简便写法。

-F, --identification-format 格式

决定 --identify 选项使用的输出格式。支持下列格式: text (文本,未使用该选项时的默认值) 以及 json。

1.text 格式简短且适合人类阅读。每项 (容器、轨道、附件等) 占一行。

该格式不应该用来解析。输出内容会翻译为 mkvmerge(1) 所使用的语言 (参见 --ui-language)。

2.json 格式输出机器可读的 JSON 表达式。此格式遵循该文件所描述的 JSON 规范:

mkvmerge-identification-output-schema-v17.json[3]

所有版本的 JSON 规范可在线获取,也可在发布的源码压缩包中找到。

--probe-range-percentage 百分比

部分文件类型,如 MPEG 节目流及传输流 (.vob、.m2ts),需要解析一定量的数据,方可侦测出文件中所包含的所有轨道。该数据量为输入文件大小的 0.3% 或 10 MB,取其中较高者。

如果已知轨道存在,但未能找到,可以通过本选项更改探测百分比。 最小值 10 MB 为内置参数,无法更改。

--list-audio-emphasis

列出 「--audio-emphasis」 选项所支持的所有有效数值及其对应的英文代号。

--list-languages

列出所有语言及其 ISO 639-2 代码,这些代码可以在 --language 选项中使用。

--list-stereo-modes

列出 「--stereo-mode」 选项所支持的所有有效数值及其对应的英文代号。

-l, --list-types

列出受支持的输入文件类型。

--priority 优先级

设置 mkvmerge(1) 运行时的进程优先级。有效的值为 'lowest(最低)', 'lower(较低)', 'normal(普通)', 'higher(较高)' 与 'highest(最高)'。如果未予设定,则使用 'normal(普通优先级)'。在 类-Unix 系统中 mkvmerge(1) 将使用 nice(2) 功能。因此只有超级用户才能使用 'higher(较高优先级)' 与 'highest(最高优先级)'。对于 Windows 用户来说所有值都可用。

选择'lowest' 不仅使用尽可能低的进程优先级,还会让 mkvmerge(1) 选择空闲 I/O 优先级。

--command-line-charset 字符集

设定在命令行给出的字符串的字符集,用于转为其他字符集。默认为系统当前区域设置中所给定的字符集。此设置将应用到以下选项的变量: --title--track-name--attachment-description

--output-charset 字符集

设置输出的字符串应被转换到何种字符集。默认为系统当前区域设置中所给定的字符集。

-r, --redirect-output 文件名

将所有信息输出至文件 文件名 而不是在命令行显示。 尽管该操作可以用输出重定向轻松实现,但在某些情况下还需要靠它:如当终端在写入文件之前重新解释(覆盖输出)时。 将优先使用通过 --output-charset 设定的字符集。

--flush-on-close

让程序在关闭以写入模式打开的文件时,强制将内存中已缓存的所有数据写入到存储设备。可用于在电源中断时避免数据损失,或规避操作系统或驱动程序的特定问题。缺点是混流耗时更长,因为 mkvmerge 在退出前需要等待所有数据写入存储设备。关于优劣的深入讨论,请参见 MKVToolNix bug 跟踪平台中的问题 #2469 与问题 #2480。

--ui-language 语言代码

强制使用 语言代码 所对应的翻译 (例如 'de_DE' 表示德文翻译)。在 语言代码 处输入 'list' 可让程序输出可用翻译的列表。

--abort-on-warnings

让程序在出现警告时即中止。程序的退出代码将返回 1。

--deterministic 种子值

启用完全确定模式。若使用的 mkvmerge(1) 版本相同,且输入文件、选项参数及种子值完全相同,则会创建二进制层面完全一致的文件。注意,此模式下不会写入剪辑信息的「date」字段。

种子值可以是任意字符串,并不非得是数字。

需要满足下列条件才能确保生成二进制层面完全相同的文件:

1.相同版本的 mkvmerge(1),且编译时使用相同版本的 ibEBML 及 libMatroska。

2.所用的输入文件在二进制层面完全一致。

3.所使用的命令行选项及顺序完全相同 (唯一的例外是「--output ...」)。

使用其他版本的 mkvmerge(1) 或其他命令行选项也有可能输出完全一致的文件,但作者不作任何保证。

--debug 主题

为特定功能开启调试。该选项仅对开发者有用。

--engage 功能

开启实验性功能。可用功能列表可通过 mkvmerge --engage list 得到。这些功能在正常情况下不应该使用。

--gui-mode

打开 GUI 模式。该模式下,将输出特殊格式的行,告知目前受控的 GUI 的行为。这些消息遵从格式「#GUI#消息」。消息可能包括键值对,如「#GUI#消息#键1=值1#键2=值2...」。消息内容及键的内容不作翻译,总是以英语输出。

@选项文件.json

从文件 选项文件 读取其他命令行参数。更多信息请参见关于 选项文件 的段落。

--capabilities

列出编译时附加的可选功能并退出。输出信息的第一行是版本信息。接下来的每行包含一个单词,各单词的出现意味着编译时附加了相应功能。这些功能包括:

•'FLAC' -- 读取原始 FLAC 文件,以及处理其他容器中的 FLAC 轨道,例如 Ogg 或 Matroska 容器中的。

-h, --help

显示用法信息并退出。

-V, --version

显示版本信息并退出。

用法

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


重要

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

选项顺序

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

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

示例

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

$ 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 尽情享受吧。如果您有多条音频轨(或者甚至是视频轨),那么您可以通过 '-vid' 与 '-aid' 选项告诉 mplayer 应该播放哪些轨道。这些是基础功能,不区分视频与音频。

如果您需要同步音频轨,会非常容易。首先找清 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)或 'contrib/subrip' 目录 transcode(1) 的源码中的 subrip 包。大体过程是这样的:

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

$ tccat -i /DVD/文件/的/路径/ -T 1 -L | tcextract -x ps1 -t vob -a 0x20 | subtitle2pgm -o 我的影片

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 我的影片.mkv 我的影片.avi 我的影片.srt

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

$ mkvmerge --list-languages

在列表中找到您所需的语言。假定您已在 Matroska 文件中放入两条音轨,并希望设置它们的语言代码,两条轨道的轨道 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-flag 3 无语言代码的文件.mkv --language 0:eng 英文字幕.srt --default-track-flag 0 --language 0:fre 法文字幕.srt

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

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

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

轨道 ID

常规轨道 ID

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

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

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

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

轨道 ID 通常这样分配:

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

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

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

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

特殊轨道 ID

一些 ID 具有特殊含义,不会出现在 id 输出结果中。

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

特殊轨道 ID '-2' 指输入文件中的章节。目前只有 --sync 选项会用到此特殊 ID。--sync -2:...--chapter-sync ... 等效。

文本文件与字符集转换


注意

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

介绍

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

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

字节序标记 (BOM)

以 BOM 开头的文本文件已经使用 UTF 的某一种模式进行编码。mkvmerge(1) 支持以下五种模式: UTF-8、UTF-16 小端序 (LE) 及大端序 (BE)、UTF-32 小端序 (LE) 及大端序 (BE)。含 BOM 的文本文件将被自动转换为 UTF-8。任何对此类文件指定字符集的参数 (如 --sub-charset) 将被直接忽略,且不输出提示信息。

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

在 Windows 平台,用于转换文本文件的默认字符集由系统调用 GetACP() 的结果决定。

读取命令行参数通过 GetCommandLineW() 函数完成,该函数所返回的已经是 Unicode 字符串。因此选项 --command-line-charset 在 Windows 平台是被忽略的。

输出到控制台分为三种情况:

1.若使用 --redirect-output 选项重定向输出,则默认字符集为 UTF-8。可以通过 --output-charset 修改。

2.若输出内容通过 cmd.exe 自身重定向,例如 mkvinfo 文件.mkv > info.txt,则其字符集必为 UTF-8,且无法修改。

3.否则 (直接写入控制台) 将使用 Windows 函数 WriteConsoleW() 并忽略 --output-charset 选项。控制台应该能够输出已安装对应语言支持的所有 Unicode 字符 (如汉字在英文版 Windows 可能不会正常显示)。

命令行选项

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

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

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

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

--output-charset 所有写入控制台的或通过 --redirect-output 选项重定向到文件的字符串的输出字符集。非 Windows 系统下,默认的输出字符集为系统的当前字符集。在 Windows 平台,默认为 UTF-8,包括通过 --redirect-output 的重定向以及 cmd.exe 自身的重定向,如 mkvinfo file.mkv > info.txt。

选项文件

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

包含 JSON 格式数据的选项文件。其内容必须为有效的 JSON 数组,数组元素只能为 JSON 字符串。文件编码必须为 UTF-8。文件开头不需要有字节序标记 (byte order marker,BOM),但即使有也没关系,会跳过它。

在 JSON 内部转义特殊字符的规则请见官方 JSON 规范 RFC 7159[4]。

选项文件名本身应添加前缀字符「@」在命令行参数给出。

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

[

"-o",
"c:\\Matroska\\我的文件.mkv",
"--title",
"#65",
"-A",
"一部影片.avi",
"声音.ogg" ]

对应的命令行则为「mkvmerge @选项文件.json」。

文件链接

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

各剪辑由唯一的 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 个 0x000xff 之间的十六进制数,各数字带有 '0x' 前缀,如 '0x41 0xda 0x73 0x66 0xd9 0xcf 0xb2 0x1e 0xae 0x78 0xeb 0xb4 0x5e 0xca 0xb3 0x93'。还可以选用另一种较短的格式: 16 个 0x000xff 之间的十六进制数,无 '0x' 前缀,无空格,如 '41da7366d9cfb21eae78ebb45ecab393'。

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

默认值

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

附件

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

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

$ mkvmerge -o 输出.mkv -A 视频.avi 声音.ogg \

--attachment-description "乐队与我在后台小聚" \
--attachment-mime-type image/jpeg \
--attach-file 乐队与我.jpg \
--attachment-description "难得一见的绝美字体" \
--attachment-mime-type application/octet-stream \
--attach-file 超酷的字体.ttf

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

章节

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

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

除了专用的章节文件格式以外,mkvmerge(1) 还能够从其他文件格式读取章节数据 (如 MP4、Ogg、Blu-ray 以及 DVD 光盘)。

简单章节格式

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

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

mkvmerge(1) 会将每一组/行内容转换为一个 Matroska ChapterAtom 元素,但不含设置 ChapterTrackNumber 「章节轨道编号」 元素,因此所有章节都将应用到文件中的所有轨道。

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

基于 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 (二进制)

从 Blu-ray 光盘读取章节数据

mkvmerge(1) 可以从未加密的 Blu-ray 光盘读取章节数据。要这样做,您可以通过「--chapters」参数提供任一 MPLS 播放列表的路径。

例: --chapters /宝藏/蓝光/BigBuckBunny/BDMV/PLAYLIST/00001.mpls

从 DVD 光盘读取章节数据

若 MKVToolNix 编译时链接了 libdvdread 库,mkvmerge(1) 就能从 DVD 光盘中读取章节数据。要这样做,您可以通过「--chapters」参数提供 DVD 文件夹或文件的路径。由于 DVD 光盘可包含多个标题,且每个标题可以有自己的一组章节,您可以在文件名参数后添加冒号及所需的标题编号。标题编号默认为 1。

例: --chapters /宝藏/dvd光盘/BigBuckBunny/VIDEO_TS:2

一般性备注

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

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

标签

介绍

Matroska 的标签系统与其他容器类似: 一组 键=值 对。不过,Matroska 中的标签还可以嵌套, 都是属于它们自身的元素。示例文件 example-tags-2.xml 展示了如何使用该系统。

标签细述

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

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

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

示例

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

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

标签文件格式

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

基本要点有:

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

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

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

数据类型

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

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

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

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

下面列出的是支持的 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 (二进制)

剪辑信息

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

还有一些 "剪辑信息" 头部字段可以通过命令行选项设置,而非通过 XML 文件。包括如 --title--timestamp-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 (二进制)

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

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

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

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

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

允许的最精简的 Matroska 文件是像这样的:

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

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

外部时间戳文件

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

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

$ mkvmerge ... --timestamps 0:我的时间戳.txt v1.avi +v2.avi

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

时间戳文件格式 v1

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

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

时间戳文件格式 v2

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

# timestamp format v2
0
40
80

时间戳文件格式 v3

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

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

时间戳文件格式 v4

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

退出代码

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

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

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

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

环境变量

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

MKVMERGE_DEBUG, MKVTOOLNIX_DEBUG 及其缩略形式 MTX_DEBUG

内容将被当作通过 --debug 选项传递的参数对待。

MKVMERGE_ENGAGE, MKVTOOLNIX_ENGAGE 及其缩略形式 MTX_ENGAGE

内容将被当作通过 --engage 选项传递的参数对待。

参阅

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

网络

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

作者

Moritz Bunkus <moritz@bunkus.org>

开发人员

备注

1.
Matroska 网站
https://www.matroska.org/
2.
IANA 主页
https://www.iana.org/assignments/media-types/
3.
mkvmerge-identification-output-schema-v17.json
https://mkvtoolnix.download/doc/mkvmerge-identification-output-schema-v17.json
4.
RFC 7159
https://tools.ietf.org/html/rfc7159
5.
Matroska 规范
https://www.matroska.org/technical/specs/index.html
6.
MKVToolNix 主页
https://mkvtoolnix.download/
2023-02-12 MKVToolNix 74.0.0