MKVMERGE(1) | 用户命令 | MKVMERGE(1) |
名称¶
mkvmerge - 将多媒体流合并为 Matroska 文件
概要¶
mkvmerge [全局选项] {-o 输出文件} [选项1] {文件1} [[选项2] {文件2}] [@选项文件.json]
说明¶
本程序以任意数量的媒体文件作为输入文件,并将它们的数据流(全部或部分)合并到 Matroska 文件中去;参见 Matroska 网站[1]。
重要
命令行选项的顺序很重要。若您对程序还不熟悉,请阅读「选项顺序」段落。
全局选项¶
-v, --verbose
-q, --quiet
-o, --output 文件名
-w, --webm
对于章节与标签,只允许使用一部分元素。mkvmerge(1) 将自动移除规范所不允许的元素。
--title 标题
--default-language 语言代码
默认的语言代码为「und」,即「undetermined」(未定)。
剪辑信息处理 (全局选项)¶
--segmentinfo 文件名.xml
详情请参见下文关于 剪辑信息 XML 文件 的段落。
--segment-uid SID1,SID2,...
若 SID 以“=”开头,则其剩余部分将作为 Matroska 文件解析,将读取并使用该文件的剪辑 UID。
创建的每个文件都包含一个剪辑,每个剪辑有一个剪辑 UID。如果指定的剪辑 UID 比创建的剪辑多,则多余的 UID 将被忽略。如果指定的 UID 比创建的剪辑少,则将随机创建 UID。
章节与标签处理 (全局选项)¶
--chapter-language 语言代码
此选项可用于简单章节文件与包含章节但不含章节语言信息的输入文件,如 MP4 与 OGM 文件。
本选项设置的语言也将用于 --generate-chapters 选项 所生成的章节。
--chapter-charset 字符集
此开关亦可应用到从特定容器类型,如 Ogg/OGM 和 MP4 文件中复制而来的章节。 详情参见下文关于章节的段落。
--chapter-sync d[,o[/p]]
o/p: 按 o/p 调整时间戳以修复线性偏移。如果省略 p 则默认为 1。o 与 p 均可为浮点数。
默认: 无手动同步校正 (与 d = 0 及 o/p = 1.0 效果相同)。
此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。
--generate-chapters 模式
此模式同时支持「parts:」及「parts-frames:」两种切割模式。对于这些模式,每段新增的时间戳范围会生成一个新章节 (其起始时间戳带有「+」前缀)。
示例: --generate-chapters interval:45s
新章节的名称由选项 --generate-chapters-name-template 控制。语言通过 --chapter-language 设置,该选项必须出现在 --generate-chapters 之前。
--generate-chapters-name-template 模板
模板中可以使用多个变量,这些变量将在生成章节时被实际值替代。字符串 '<NUM>' 将被章节号替代。字符串 '<START>' 将被章节的起始时间戳替代。
字符串 「<FILE_NAME>」 与 「'<FILE_NAME_WITH_EXT>」 只会在为追加文件生成章节时进行填充。 它们会被替换为追加文件的文件名,前者不含扩展名,后者包含扩展名。 注意,只会插入文件本身的名称(及扩展名),不会插入其目录名或盘符。
您可以以 '<NUM:位数>' 的形式指定章节编号的最少位数,如 '<NUM:3>'。最终的数字,若其位数小于指定位数,则将在开头补零。
您可以以 <START:格式>的形式控制起始时间戳的格式。若未给出格式,则默认为 '%H:%M:%S'。有效的格式代码包括:
--cue-chapter-name-format 格式
如果此选项未给定则 mkvmerge(1) 默认使用 '%p - %t' 格式 (表演者, 后接空格, 一个破折号, 另一个空格以及标题)。
如果给定了格式,则除了后续的标签字符以外都将被原样复制,标签字符将被进行下述替换:
--chapters 文件名
--global-tags 文件名
全局输出控制 (高级全局选项)¶
--track-order FID1:TID1,FID2:TID2,...
--cluster-length 指令
如果未使用数字,mkvmerge(1) 将在每个簇中放置最多 n 个数据块。最大块数是 65535。
如果数字 d 后缀有 'ms',mkvmerge(1) 将在每个簇中放置最多 d 毫秒的数据。d 的最小值是 '100ms',最大值是 '32000ms'。
mkvmerge(1) 默认每簇最多放置 65535 个数据块或 5000ms 的数据。
尝试定位到特定帧的程序只能直接定位到簇,然后需要读取整个簇(来完成定位)。因此创建较大的簇将导致定位不精确或缓慢。
--clusters-in-meta-seek
--timestamp-scale 系数
通常 mkvmerge(1) 会使用数值 1000000,这样时间戳和时长的精度为 1ms。对于不包含视频轨但含有至少一条音频轨的文件,mkvmerge(1) 将自动选择一个时间戳缩放系数以使各轨的音频采样精度相同。这将引起更大的额外开销,但将允许更为精确的定位与提取。
如果使用了特殊值 -1,即使有视频轨,mkvmerge(1) 也将使用采样精度。
--enable-durations
--no-cues
--no-date
--disable-lacing
--disable-track-statistics-tags
启用本选项可阻止 mkvmerge(1) 写入这些标签或修改现有的同名标签。
--disable-language-ietf
--normalize-language-ietf 模式
最简式模式下,所有存在推荐值(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) 支持以下模式:
语法: --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 timestamps:A[,B[,C...]]
示例: --split timestamps:00:45:00.000,01:20:00.250,6300s
参数 A、B、C 等等的格式与按时长切割模式(见上文)所用的格式相同。时间戳表以逗号分隔。 输入流达到当前切割点的时间戳后将创建新的输出文件。然后将使用所给定的下一个切割点。
'timestamps:' 前缀不得省略。
语法: --split parts:起点1-终点1[,[+]起点3-终点2[,[+]起点3-终点3...]]
示例:
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) 也将继续输出帧,直到下一关键帧为止(不包括)。
语法: --split parts-frames:起点1-终点1[,[+]起点2-终点2[,[+]起点3-终点3...]]
示例:
parts-frames 模式可以告诉 mkvmerge(1) 保留特定帧/场序号范围,而丢弃其余部分。要保留的范围需要在 parts-frames: 关键词后列出,以逗号隔开。各分段由起始及终止帧/场序号组成。序号从 1 开始计数。
若起始序号留空,则默认为前一段的终止序号。若不存在前一段,则默认为文件开头 (参见示例 3)。
若终止序号留空,则默认为文件末尾,亦即告诉 mkvmerge(1) 保留其余部分 (参见示例 3)。
通常每一段都会写入新的文件。该行为也可以调整,以便将连续的分段写入同一个文件。要实现这种效果,用户可以在起始序号开头加上 + 前缀。这样可以告诉 mkvmerge(1) 不要创建新文件,而是将该分段写入与之前一段相同的文件当中。时间戳也会自动调整,确保即使输入文件中两分段不连续,输出文件中也不出现间隙。
注意
请注意,mkvmerge(1) 只在关键帧位置决定是否切割。每段切割区域的起始点与结束点均为关键帧。因此即使结束帧/场序号介于两个关键帧之间,mkvmerge(1) 也将继续输出帧,直到下一关键帧为止(不包括)。
例 2 中 mkvmerge(1) 将只创建一个文件。该文件包含从 733 到 912 及从 1592 到 2730 的内容。
例 3 中 mkvmerge(1) 将创建两个文件。第一个包含输入文件开头到 430 的内容。第二个文件将包含从 2512 到输入文件结尾之间的内容。
该模式只考虑输出的第一条视频轨道。 如果没有输出视频轨道,则将不会进行切割操作。
注意
通过本参数给出的数字将根据输出的 Matroska 区块解析。 单个 Matroska 区块可包含完整的一帧 (对于逐行扫描的内容) 或单场 (对于隔行扫描的内容)。 mkvmerge 不区分两者,它直接统计区块数目。 例如: 假设某人希望在隔行扫描的第 25 个完整帧之后切割,则应使用 50 (每帧对应两场) 作为切割点。
语法: --split frames:A[,B[,C...]]
示例: --split frames:120,237,891
参数 A、B、C 等等必须全为正整数。编号从 1 开始。 帧/场编号列表以逗号分隔。 输入流达到当前切割点的帧/场编号后将创建新的输出文件。然后将使用所给定的下一个切割点。
'frames:' 前缀不得省略。
该模式只考虑输出的第一条视频轨道。 如果没有输出视频轨道,则将不会进行切割操作。
注意
通过本参数给出的数字将根据输出的 Matroska 区块解析。 单个 Matroska 区块可包含完整的一帧 (对于逐行扫描的内容) 或单场 (对于隔行扫描的内容)。 mkvmerge 不区分两者,它直接统计区块数目。 例如: 假设某人希望在隔行扫描的第 25 个完整帧之后切割,则应使用 50 (每帧对应两场) 作为切割点。
语法: --split chapters:all or --split chapters:A[,B[,C...]]
示例: --split chapters:5,8
参数 A、B、C 等等必须全为正整数。编号从 1 开始。 章节编号列表以逗号分隔。 切割将在时间戳等于或大于所列编号对应章节的起始时间戳的首个关键帧之前进行。从 0s 开始的章节将不作考虑,并不作提示,直接丢弃。
关键词 all 可选择所有章节编号,无需手工输入。
'chapters:' 前缀不得省略。
注意
Matroska 文件格式支持任意深度嵌套的章节结构,称为“版本条目”与“章节单位”。 但该模式仅考虑所有版本条目中最顶层的章节。
此切割模式下输出文件名将以不同于常用操作的方式对待。可能会含有类似 printf 中 '%d' 的表达式,包括可选的字段宽度,如 '%02d'。如果含有上述表达式,当前文件序号将按相应格式生成,然后插入到文件名中的相应位置。 如果没有此类匹配模式,则假定匹配模式为在文件扩展名之前插入 '-%03d': '-o 输出.mkv' 将生成 '输出-001.mkv' 这样的一系列文件。如果没有扩展名,'-%03d' 将被追加在文件名之后。
也可以选用「%c」,它将被替换为文件中首个章节的名称。注意:当「%c」存在时,不会再自动添加「-%03d」。
--link
--link-to-previous 剪辑-UID
若 SID 以“=”开头,则其剩余部分将作为 Matroska 文件解析,将读取并使用该文件的剪辑 UID。
--link-to-next 剪辑-UID
若 SID 以“=”开头,则其剩余部分将作为 Matroska 文件解析,将读取并使用该文件的剪辑 UID。
--append-mode 模式
当 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 相同时,这将允许简单的追加合并,命令行为 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 ']'
=
'=' 也可以放在下一个文件名的前面。因此以下两条命令等效:
$ 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 ')'
应该注意的几件事:
附件支持 (其他全局选项)¶
--attachment-description 描述
--attachment-mime-type MIME 类型
如果没有指定附件的 MIME 类型,则会自动侦测其类型。
--attachment-name 名称
--attach-file 文件名, --attach-file-once 文件名
可以使用 mkvextract(1) 从 Matroska 文件中提取附件文件。
--enable-legacy-font-mime-types
这将同时影响未手动指定 MIME 类型的新附件,以及现有的字体附件,其已存在的 MIME 类型将被重新映射至传统类型。
受影响的 MIME 类型如下:「font/sfnt」「font/ttf」「font/collection」将全部映射至「application/x-truetype-fonts」,「 font/otf」将被映射至「application/vnd.ms-opentype」。
用于各输入文件的选项¶
-a, --audio-tracks [!]n,m,...
除轨道 ID 以外,您还可以提供 ISO 639-2 语言代码。仅当输入文件的轨道包含语言标签时可用。
默认: 复制该类的所有轨道。
若 ID 以 ! 开头,则其意义相反: 复制该类的所有轨道,除了 ! 后面所列出的轨道。
-d, --video-tracks [!]n,m,...
除轨道 ID 以外,您还可以提供 ISO 639-2 语言代码。仅当输入文件的轨道包含语言标签时可用。
若 ID 以 ! 开头,则其意义相反: 复制该类的所有轨道,除了 ! 后面所列出的轨道。
-s, --subtitle-tracks [!]n,m,...
除轨道 ID 以外,您还可以提供 ISO 639-2 语言代码。仅当输入文件的轨道包含语言标签时可用。
若 ID 以 ! 开头,则其意义相反: 复制该类的所有轨道,除了 ! 后面所列出的轨道。
-b, --button-tracks [!]n,m,...
除轨道 ID 以外,您还可以提供 ISO 639-2 语言代码。仅当输入文件的轨道包含语言标签时可用。
若 ID 以 ! 开头,则其意义相反: 复制该类的所有轨道,除了 ! 后面所列出的轨道。
--track-tags [!]n,m,...
如果 ID 以 ! 作为前缀,则含义相反: 复制除了列在 ! 后面的 ID 以外的所有轨道。
-m, --attachments [!]n[:all|first],m[:all|first],...
默认复制所有附件到所有输出文件中。
如果 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]]
o/p: 按 o/p 调整时间戳以修复线性偏移。如果省略 p 则默认为 1。o 与 p 均可为浮点数。
默认: 无手动同步校正 (与 d = 0 及 o/p = 1.0 效果相同)。
此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。
--cues TID:none|iframes|all
默认值为 'iframes(仅 i 帧)'(视频及字幕轨道)或 'none(无)'(音频轨道)。参见 --no-cues 选项,后者可阻止 cue 条目的创建,无论是否使用了 --cues 选项。
此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。
--default-track-flag TID[:布尔值]
如果用户在播放时不明确选择一条轨道,播放器应选择已设有「默认轨」标记的轨道,同时也应考虑用户偏好设置,例如用户偏好的语言。
此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。
--track-enabled-flag TID[:布尔值]
只有设置了「轨道启用」标记的轨道才应作为播放器考虑播放的对象。
此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。
--forced-display-flag TID[:布尔值]
此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。
--hearing-impaired-flag TID[:布尔值]
此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。
--visual-impaired-flag TID[:布尔值]
此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。
--text-descriptions-flag TID[:布尔值]
此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。
--original-flag TID[:布尔值]
此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。
--commentary-flag TID[:布尔值]
此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。
--blockadd TID:层级
--track-name TID:名称
--language TID:语言
此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。
-t, --tags TID:文件名
--aac-is-sbr TID[:0|1]
如果输入文件是 Matroska 文件,则已有足够侦测 SBR AAC 的 CodecID 了。然而,如果 CodecID 标注错误,此开关可用于更正之。
如果 mkvmerge 错将 AAC 文件侦测为 SBR,您可以将 ':0' 添加到轨道 ID。
--audio-emphasis TID:n|代号
--reduce-to-core 轨道ID
目前只有 DTS 轨道受此选项影响。嵌入 AC-3 核心的 TrueHD 轨道以两个轨道的形式呈现,用户可以选择复制哪个轨道。DTS 无法采用这种方案,因为 HD 扩展部分不能单独解码 – 而 TrueHD 数据可以。
--remove-dialog-normalization-gain 轨道ID
目前只有 AC-3、DTS 与 TrueHD 轨道受此选项影响。
--timestamps TID:文件名
--default-duration TID:x
如果未强制指定默认时长,mkvmerge 将尝试继承容器中(及/或特定轨道类型,如 AVC/H.264 或 MPEG-2 已编码的位流中)该轨道的默认时长。
此选项也可用于在不使用外部时间戳文件的情况下更改视频轨的 FPS(帧率)。
--fix-bitstream-timing-information TID[:0|1]
注意
目前仅完成对 AVC/H.264 视频轨的实现。
--compression TID:n
压缩方式 'mpeg4_p2'/'mpeg4p2' 是一种称为 '去头' 的特殊压缩方式,只对 MPEG4 part 2 视频轨可用。
部分字幕类型的默认压缩算法为 'zlib'。该算法也是大多数(如果不是所有)回放应用程序所支持的算法。无法保证对其他压缩算法的支持('none(不压缩)' 除外)。
仅用于视频轨的选项¶
-f, --fourcc TID:FourCC
--display-dimensions TID:宽度x高度
指定所用数值的其他方法是使用 --aspect-ratio 或 --aspect-ratio-factor 选项 (参见下文)。 这些选项是互相独立的。
--aspect-ratio TID:宽高比|宽度/高度
指定所用数值的其他方法是使用 --aspect-ratio-factor 或 --display-dimensions 选项 (参见上下文)。这些选项相互独立。
--aspect-ratio-factor TID:系数|n/d
指定所用数值的其他方法是使用 --aspect-ratio 或 --display-dimensions 选项 (参见上文)。这些选项互相独立。
--cropping TID:左,上,右,下
--color-matrix-coefficients TID:n
有效的值及其含义如下:
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
--chroma-subsample TID:水平,垂直
例如: 对于色度抽样为 4:2:0 的视频,该参数应设为 TID:1,1。
--cb-subsample TID:水平,垂直
例如: 对于色度抽样为 4:2:1 的视频,参数 --chroma-subsample 应设为 TID:1,0,Cb 抽样应设为 TID:1,0。
--chroma-siting TID:水平,垂直
--color-range TID:n
--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
--max-frame-light TID:n
--chromaticity-coordinates TID:red-x,red-y,green-x,green-y,blue-x,blue-y
--white-color-coordinates TID:x,y
--max-luminance TID:浮点数
--min-luminance TID:浮点数
--projection-type TID:方式
--projection-private TID:数据
--projection-pose-yaw TID:浮点数
--projection-pose-pitch TID:浮点数
--projection-pose-roll TID:浮点数
--field-order TID:n
0: 逐行扫描; 1: 隔行扫描,顶场先显示,顶场先存储; 2: 未定场序; 6: 隔行扫描,底场先显示,底场先存储; 9: 隔行扫描,底场先显示,顶场先存储; 14: 隔行扫描,顶场先显示,底场先存储
--stereo-mode TID:n|代号
仅适用于文本字幕轨道的选项¶
--sub-charset TID:字符集
此选项可以对同一输入文件多次使用,通过每次选择不同轨道 ID 分别应用到多个轨道。
其他选项¶
-i, --identify 文件名
结果的输出格式可以通过 --identification-format 选项修改。
-J 文件名
-F, --identification-format 格式
该格式不应该用来解析。输出内容会翻译为 mkvmerge(1) 所使用的语言 (参见 --ui-language)。
mkvmerge-identification-output-schema-v17.json[3]
所有版本的 JSON 规范可在线获取,也可在发布的源码压缩包中找到。
--probe-range-percentage 百分比
如果已知轨道存在,但未能找到,可以通过本选项更改探测百分比。 最小值 10 MB 为内置参数,无法更改。
--list-audio-emphasis
--list-languages
--list-stereo-modes
-l, --list-types
--priority 优先级
选择'lowest' 不仅使用尽可能低的进程优先级,还会让 mkvmerge(1) 选择空闲 I/O 优先级。
--command-line-charset 字符集
--output-charset 字符集
-r, --redirect-output 文件名
--flush-on-close
--ui-language 语言代码
--abort-on-warnings
--deterministic 种子值
种子值可以是任意字符串,并不非得是数字。
需要满足下列条件才能确保生成二进制层面完全相同的文件:
使用其他版本的 mkvmerge(1) 或其他命令行选项也有可能输出完全一致的文件,但作者不作任何保证。
--debug 主题
--engage 功能
--gui-mode
@选项文件.json
--capabilities
-h, --help
-V, --version
用法¶
用户可以选择各文件中 mkvmerge(1) 应该使用的轨道。它们都将被封装到 -o 所指定的文件中。可通过 -l 选项获取已知(且受支持的)输入格式列表。
重要
命令行选项的顺序很重要。若您对程序还不熟悉,请阅读「选项顺序」段落。
选项顺序¶
输入选项的顺序对一些选项很重要。选项可归为两类:
选项从左向右处理。如果同一个选项在同一范围内出现多次,将使用最后一次给出的参数。因此在下面的例子中,标题将被设为 "其他东东":
$ 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 包。大体过程是这样的:
$ tccat -i /DVD/文件/的/路径/ -T 1 -L | tcextract -x ps1 -t vob -a 0x20 | subtitle2pgm -o 我的影片
$ pgm2txt mymovie
$ ispell -d american *txt
$ 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 通常这样分配:
使用轨道 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 ... 等效。
文本文件与字符集转换¶
介绍¶
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) 将被直接忽略,且不输出提示信息。
Linux 及类 Unix 系统,包括 macOS¶
在 类-Unix 系统 mkvmerge(1) 将使用 setlocale(3) 系统指令,它将返回环境变量 LANG、LC_ALL 及 LC_CYPE。输出的字符集通常是 UTF-8 或 ISO-8859-* 家族之一,将被用于所有文本文件操作以及编码命令行上的字符串和输出到命令行。
Windows¶
在 Windows 平台,用于转换文本文件的默认字符集由系统调用 GetACP() 的结果决定。
读取命令行参数通过 GetCommandLineW() 函数完成,该函数所返回的已经是 Unicode 字符串。因此选项 --command-line-charset 在 Windows 平台是被忽略的。
输出到控制台分为三种情况:
命令行选项¶
现有下述选项支持指定字符集:
选项文件¶
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 个 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 建立链接。
默认值¶
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>
使用此格式可以做到三件简单章节格式做不到的事:
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 的示例文件,该文件已简明地列出了所有已知的可用作实际处理的基本标签。
基本要点有:
数据类型¶
新的 Matroska 标签系统只识别两种数据类型,UTF-8 字串与二进制类型。前者用于标签名称和 <String> 元素,而二进制类型用于 <Binary> 元素。
由于二进制数据自身与 XML 文件不相容,mkvmerge(1) 支持另两种储存二进制数据的方法。如果 XML 标签的内容以 '@' 开头,则后续文本将被作为文件名对待。相应文件的内容将被复制到 Matroska 元素中。
还有一种可能,即数据经 Base64 编码。这是将二进制数据转换为一定的 ASCII 字集字符,在电子邮件等程序中有所应用。mkvextract(1) 将将二进制元素以 Base64 编码的数据的形式输出。
已被废弃的标签系统可识别更多的数据类型,这在 Matroska 官方的标签规范中可以找到。由于 mkvmerge(1) 不再支持此系统,此处不对这些类型作多余说明。
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 (二进制)
剪辑信息¶
可以通过剪辑信息 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 文件规划¶
Matroska 文件规划非常灵活。mkvmerge(1) 将按预先定义的方式渲染文件。生成的文件是这样的:
[EBML 头] [剪辑 {元定位 #1} [剪辑信息] [轨道信息] {附件} {章节} [簇 1] {簇 2} ... {簇 n} {索引} {元定位 #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) 退出时会返回以下三个退出代码中的一个:
环境变量¶
mkvmerge(1) 会使用决定系统区域设置的默认变量 (如 LANG 与 LC_* 族)。其他变量包括:
MKVMERGE_DEBUG, MKVTOOLNIX_DEBUG 及其缩略形式 MTX_DEBUG
MKVMERGE_ENGAGE, MKVTOOLNIX_ENGAGE 及其缩略形式 MTX_ENGAGE
参阅¶
mkvinfo(1), mkvextract(1), mkvpropedit(1), mkvtoolnix-gui(1)
网络¶
最新版本总可以在 MKVToolNix 主页[6] 找到。
作者¶
Moritz Bunkus <moritz@bunkus.org>
备注¶
- 1.
- Matroska 网站
- 2.
- IANA 主页
- 3.
- mkvmerge-identification-output-schema-v17.json
- 4.
- RFC 7159
- 5.
- Matroska 规范
- 6.
- MKVToolNix 主页
2023-02-12 | MKVToolNix 74.0.0 |