使用 mkvpropedit 工具直接修改视频文件的默认音轨

文件信息

视频文件里的粤语音轨有些在轨道 ID 3: audio (AAC),有些在轨道 ID 2: audio (AAC)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
G:\>D:\software\mkvtoolnix\mkvmerge -i 灌篮高手.1080P.国粤日三语.软字幕.AVC.默认粤语音频.001.mkv
文件 「灌篮高手.1080P.国粤日三语.软字幕.AVC.默认粤语音频.001.mkv」: 容器: Matroska
轨道 ID 0: video (AVC/H.264/MPEG-4p10)
轨道 ID 1: audio (AAC)
轨道 ID 2: audio (FLAC)
轨道 ID 3: audio (AAC)
轨道 ID 4: subtitles (SubStationAlpha)

G:\>D:\software\mkvtoolnix\mkvmerge -i 灌篮高手.1080P.国粤日三语.软字幕.AVC.默认粤语音频.002.mkv
文件 「灌篮高手.1080P.国粤日三语.软字幕.AVC.默认粤语音频.002.mkv」: 容器: Matroska
轨道 ID 0: video (AVC/H.264/MPEG-4p10)
轨道 ID 1: audio (AAC)
轨道 ID 2: audio (FLAC)
轨道 ID 3: audio (AAC)
轨道 ID 4: subtitles (SubStationAlpha)

G:\>D:\software\mkvtoolnix\mkvmerge -i 灌篮高手.1080P.国粤日三语.软字幕.AVC.默认粤语音频.003.mkv
文件 「灌篮高手.1080P.国粤日三语.软字幕.AVC.默认粤语音频.003.mkv」: 容器: Matroska
轨道 ID 0: video (AVC/H.264/MPEG-4p10)
轨道 ID 1: audio (AAC)
轨道 ID 2: audio (AAC)
轨道 ID 3: audio (FLAC)
轨道 ID 4: subtitles (SubStationAlpha)
轨道 ID 5: subtitles (SubStationAlpha)

G:\>D:\software\mkvtoolnix\mkvmerge -i 灌篮高手.1080P.国粤日三语.软字幕.AVC.默认粤语音频.004.mkv
文件 「灌篮高手.1080P.国粤日三语.软字幕.AVC.默认粤语音频.004.mkv」: 容器: Matroska
轨道 ID 0: video (AVC/H.264/MPEG-4p10)
轨道 ID 1: audio (AAC)
轨道 ID 2: audio (AAC)
轨道 ID 3: audio (FLAC)
轨道 ID 4: subtitles (SubStationAlpha)

单件处理

1
D:\software\mkvtoolnix\mkvpropedit.exe "灌篮高手.1080P.国粤日三语.软字幕.AVC.默认国语音频.001.mkv" --edit track:a1 --set flag-default=0 --set flag-forced=0 --edit track:a2 --set flag-default=0 --set flag-forced=0 --edit track:a3 --set flag-default=1 --set flag-forced=1

批量处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
@echo off
setlocal enabledelayedexpansion

:: 设置输入文件夹
set "input_folder=G:\"

:: 遍历输入文件夹中的所有 MKV 文件
for %%f in ("%input_folder%\*.mkv") do (
echo Processing file: %%f

:: 获取音轨信息并存储到临时文件
D:\software\mkvtoolnix\mkvmerge.exe -i "%%f" > temp_tracks.txt

:: 初始化变量
set "hasAAC2=0"
set "hasAAC3=0"
set "hasFLAC=0"

:: 检查音轨信息
for /f "tokens=*" %%a in (temp_tracks.txt) do (
echo Debug: %%a
if "%%a"=="轨道 ID 2: audio (AAC)" (
set "hasAAC2=1"
) else if "%%a"=="轨道 ID 3: audio (AAC)" (
set "hasAAC3=1"
) else if "%%a"=="轨道 ID 3: audio (FLAC)" (
set "hasFLAC=1"
)
)

:: 根据条件修改默认音轨
if "!hasAAC2!"=="1" (
echo Setting AAC track ID 2 as default for file: %%f
D:\software\mkvtoolnix\mkvpropedit.exe "%%f" --edit track:a1 --set flag-default=0 --set flag-forced=0 --edit track:a2 --set flag-default=1 --set flag-forced=1 --edit track:a3 --set flag-default=0 --set flag-forced=0
) else if "!hasAAC3!"=="1" (
echo Setting AAC track ID 3 as default for file: %%f
D:\software\mkvtoolnix\mkvpropedit.exe "%%f" --edit track:a1 --set flag-default=0 --set flag-forced=0 --edit track:a2 --set flag-default=0 --set flag-forced=0 --edit track:a3 --set flag-default=1 --set flag-forced=1
) else (
echo No valid AAC track found for file: %%f
)

:: 删除临时文件
del temp_tracks.txt
)

echo All files processed.
pause

重新命名

保存rename.py,执行python rename.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import os

# 定义文件夹路径
folder_path = r"G:\"

# 遍历文件夹中的所有文件
for filename in os.listdir(folder_path):
# 检查文件扩展名是否为.mkv
if filename.endswith(".mkv"):
# 检查文件名是否符合特定模式
if "国语音频" in filename:
# 替换最后一个“国”字为“粤”字
new_name = filename.rsplit("", 1)[0] + "" + filename.rsplit("", 1)[1]
# 构造完整的文件路径
old_file_path = os.path.join(folder_path, filename)
new_file_path = os.path.join(folder_path, new_name)
# 重命名文件
os.rename(old_file_path, new_file_path)
print(f"重命名:{filename} -> {new_name}")

print("所有符合条件的文件已重命名完成。")

处理结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
G:\>D:\software\mkvtoolnix\mkvinfo.exe 灌篮高手.1080P.国粤日三语.软字幕.AVC.默认粤语音频.001.mkv
+ EBML 头
|+ EBML 版本: 1
|+ EBML 读取版本: 1
|+ EBML ID 最大长度: 4
|+ EBML 大小最大长度: 8
|+ 文档类型: matroska
|+ 文档类型版本: 4
|+ 文档类型读取版本: 2
+ 剪辑: 大小 1397911679
|+ 定位头 (子条目将被跳过)
|+ 轨道
| + 轨道
| + 轨道编号: 1 (mkvmerge & mkvextract 的轨道 ID: 0)
| + 轨道 UID: 1
| + 轨道类型: 视频
| + 「紧缩」 标记: 0
| + 编码格式 ID: V_MPEG4/ISO/AVC
| + 编解码器私有数据: 大小 45 (H.264 档次: High 10 @L5.1)
| + 默认帧时长: 00:00:00.041708333 (对应视频轨的 23.976 帧/场每秒)
| + 语言: jpn
| + 名称: [Kagura] Slam Dunk - 001 [BDRip 1440x1080 x264 Hi10P FLAC]
| + 视频轨道
| + 像素宽度: 1440
| + 像素高度: 1080
| + 显示宽度: 1440
| + 显示高度: 1080
| + 轨道
| + 轨道编号: 2 (mkvmerge & mkvextract 的轨道 ID: 1)
| + 轨道 UID: 4259734031005461432
| + 轨道类型: 音频
| + 「强制显示」 标记: 0
| + 编码格式 ID: A_AAC
| + 编解码器私有数据: 大小 5
| + 默认帧时长: 00:00:00.021333333 (对应视频轨的 46.875 帧/场每秒)
| + 语言: chi
| + 名称: 国语Mandarin
| + 音频轨
| + 采样率: 48000
| + 声道数: 2
| + 「默认轨」 标记: 0
| + 轨道
| + 轨道编号: 3 (mkvmerge & mkvextract 的轨道 ID: 2)
| + 轨道 UID: 17988462785428992699
| + 轨道类型: 音频
| + 「默认轨」 标记: 0
| + 「强制显示」 标记: 0
| + 编码格式 ID: A_FLAC
| + 编解码器私有数据: 大小 113
| + 默认帧时长: 00:00:00.085333333 (对应视频轨的 11.719 帧/场每秒)
| + 语言: jpn
| + 音频轨
| + 采样率: 48000
| + 声道数: 2
| + 位深: 16
| + 轨道
| + 轨道编号: 4 (mkvmerge & mkvextract 的轨道 ID: 3)
| + 轨道 UID: 4385456018886019507
| + 轨道类型: 音频
| + 「默认轨」 标记: 1
| + 编码格式 ID: A_AAC
| + 编解码器私有数据: 大小 5
| + 默认帧时长: 00:00:00.046439909 (对应视频轨的 21.533 帧/场每秒)
| + 语言: chi
| + 名称: 粤语Cantonese
| + 音频轨
| + 采样率: 22050
| + 输出采样频率: 44100
| + 「强制显示」 标记: 1
| + 轨道
| + 轨道编号: 5 (mkvmerge & mkvextract 的轨道 ID: 4)
| + 轨道 UID: 4592099748104795573
| + 轨道类型: 字幕
| + 「紧缩」 标记: 0
| + 编码格式 ID: S_TEXT/ASS
| + 编解码器私有数据: 大小 1488
| + 语言: chi
| + 名称: 诸神简日双语字幕
|+ EBML void: 大小 1923
|+ 剪辑信息
| + 时间戳缩放: 1000000
| + 混流应用程序: libebml v1.3.6 + libmatroska v1.4.9
| + 写入应用程序: mkvmerge v24.0.0 ('Beyond The Pale') 64-bit
| + 时长: 00:19:39.921000000
| + 日期: 2018-06-13 04:01:56 UTC
| + 剪辑 UID: 0x1c 0xe1 0xb8 0x3d 0x99 0x9b 0x00 0x62 0x4c 0x68 0x7d 0x14 0x12 0xf2 0x71 0xf9
|+ EBML void: 大小 3282
|+ 簇