做视频处理的人多半和 MKV 格式打过交道——一个容器塞进多条音轨、多语言字幕、章节标记,灵活度远超 MP4。而操作这个容器最直接的工具,就是 MKVToolNix。99.0 版本近日发布,GUI 层面做了几处体验优化,CLI 核心能力依旧扎实。下面聊聊它能干什么、新版本改了什么,以及日常怎么用命令行快速封装和拆包。
MKVToolNix 的核心能力
MKVToolNix 不是编解码器,它不转码。它的职责是封装与拆解——把现成的视频流、音频流、字幕文件打包进 Matroska 容器,或者从 MKV 里提取特定轨道。典型场景:
- 把 H.264 视频 + FLAC 音轨 + ASS 字幕合成一个 MKV
- 给已有 MKV 追加一条中文字幕轨,不重新编码
- 从 MKV 中单独抽出某条音轨或字幕,供后续编辑
- 添加章节信息、标签、附件(比如字体文件)
整套工具包含 mkvmerge(封装)、mkvinfo(查看信息)、mkvextract(提取)、mkvpropedit(属性修改)等命令行程序,以及一个 GUI 前端。日常批量操作用 CLI 更高效,GUI 适合偶尔手工调整。
99.0 版本更新要点
这次更新的改动集中在 GUI 的交互细节上,核心合并逻辑没有大变动:
- "播放音频文件"程序运行器独立记忆目录:GUI 中有个"play audio file"功能,用于快速预览音轨。之前它和其他程序运行器共用最近目录记录,现在单独维护了最后使用的目录。这意味着你选完一条音轨的路径后,下次打开预览不会跳回视频目录,减少反复导航的麻烦。
- 其他增强和 bugfix 涉及 GUI 的布局稳定性、轨道列表显示等,属于常规打磨。
对 CLI 用户来说,99.0 的行为与之前版本一致,升级不会打断现有脚本。
实战:用命令行封装和拆解 MKV
下面给出几个可以直接跑的示例,基于 Linux/macOS 环境(Windows 用户把命令换成 mkvmerge.exe 等,路径用反斜杠或引号包裹即可)。
1. 多轨封装——视频 + 双音轨 + 双字幕
假设你有一个视频文件、两条音轨(原声和配音)、两条 ASS 字幕:
mkvmerge \
-o "output.mkv" \
--language 0:en --track-name "原声" "video_with_en_audio.mp4" \
--language 0:zh --track-name "配音" "dub_audio.m4a" \
--language 0:zh --track-name "中文字幕" --sub-charset 0:UTF-8 "sub_zh.ass" \
--language 0:en --track-name "英文字幕" --sub-charset 0:UTF-8 "sub_en.ass"
要点说明:
- --language 0:en 中 0 指输入文件的第 0 条轨道(大多数视频文件只有一条视频轨,编号 0;音频文件的第 0 条就是音频轨本身)
- --sub-charset 对 ASS/SRT 字幕很重要,缺了会乱码
- 输出文件名用 -o 指定
2. 给已有 MKV 追加字幕,不重编码
mkvmerge -o "movie_with_new_sub.mkv" "movie.mkv" --language 0:zh "new_sub.srt"
mkvmerge 会把原 MKV 的所有轨道原样搬进新文件,再追加 SRT。原文件不受影响,新文件体积只多了一截字幕文本。
3. 查看 MKV 内部结构
mkvinfo "output.mkv"
输出会列出每条轨道的 codec ID、语言、时长、默认/强制标记等。加 --verbose 可以看到段级别细节。
4. 从 MKV 中提取特定轨道
先确认轨道编号:
mkvmerge --identify "output.mkv"
输出类似:
Track ID 1: video (V_MPEG4/ISO/AVC)
Track ID 2: audio (A_FLAC) [en]
Track ID 3: audio (A_FLAC) [zh]
Track ID 4: subtitles (S_TEXT/ASS) [zh]
Track ID 5: subtitles (S_TEXT/ASS) [en]
然后提取第 4 条字幕轨:
mkvextract tracks "output.mkv" 4:"extracted_sub.ass"
也可以同时提取多条:
mkvextract tracks "output.mkv" 2:"en_audio.flac" 3:"zh_audio.flac" 4:"zh_sub.ass"
5. 批量封装脚本
如果你有一堆视频需要挂上同一组字幕,写个简单循环:
#!/bin/bash
SUB_DIR="./subs"
OUT_DIR="./merged"
mkdir -p "$OUT_DIR"
for video in ./raw/*.mp4; do
basename=$(basename "$video" .mp4)
mkvmerge -o "${OUT_DIR}/${basename}.mkv" \
"$video" \
--language 0:zh "${SUB_DIR}/${basename}.ass"
done
echo "批量封装完成,输出目录: $OUT_DIR"
运行前确保 ./raw/ 下有视频文件,./subs/ 下有对应命名的 ASS 字幕。改路径即可适配自己的目录结构。
日常使用建议
- 封装优先用 CLI:GUI 适合探索和单次操作,但批量任务、CI 流程、自动化脚本都该走
mkvmerge,参数可控、可复现。 - 轨道语言和字符集别省:
--language和--sub-charset看起来啰嗦,但播放器依赖这些标记来决定默认音轨和字幕渲染。省了之后,用户端就要手动选,体验打折。 - 提取前先 identify:轨道编号不是固定的,多音轨 MKV 的编号顺序取决于封装时的输入顺序。
--identify一秒钟的事,避免提错轨。 - 升级不必担心兼容性:MKVToolNix 的 CLI 参数风格从 30 多个版本前就基本稳定,99.0 没有破坏性改动。现有脚本可以直接升级继续跑。
- GUI 的目录记忆功能值得留意:如果你经常在 GUI 里预览音轨,99.0 的独立目录记忆会省掉不少路径切换。其他程序运行器(比如自定义外部播放器)后续也可能获得类似的独立记忆,关注后续 release note。
MKVToolNix 做的事看似简单——拼装和拆包——但 Matroska 容器的灵活度本身就值得善用。多音轨、多字幕、章节、附件这些能力,用好了是发行级体验,用不好就是播放器里的混乱列表。工具已经够锋利,关键在于封装时把语言、命名、默认标记这些元数据填对。