文件夹中有多个视频文件,默认音频声道为俄语,想调整成英语:
先安装 MKVToolNix软件,然后使用 mkvinfo 工具来查看 .mkv 文件的音轨信息,在命令行中输入命令:
mkvinfo "F:\aivideo\The Legend of Tarzan - 16 - Tarzan and the Leopard Men Rebellion.mkv"
来查看轨道信息:
- EBML 头
|+ EBML 版本: 1
|+ EBML 读取版本: 1
|+ EBML ID 最大长度: 4
|+ EBML 大小最大长度: 8
|+ 文档类型: matroska
|+ 文档类型版本: 4
|+ 文档类型读取版本: 2
- 剪辑: 大小 556452947
|+ 定位头 (子条目将被跳过)
|+ EBML void: 大小 4027
|+ 剪辑信息
| + 时间戳缩放: 1000000
| + 混流应用程序: libebml v1.4.5 + libmatroska v1.7.1
| + 写入应用程序: mkvmerge v88.0 ('All I Know') 64-bit
| + 时长: 00:21:46.400000000
| + 日期: 2024-11-21 02:52:45 UTC
| + 标题: The Legend of Tarzan [1x06] HDTV 720p x264 [Source: ThV, Encode: GD]
| + 剪辑 UID: 0x44 0x0d 0x7e 0xac 0xb1 0xd5 0x00 0x8d 0x02 0x45 0x91 0x76 0xda 0xba 0xf2 0xf2
|+ 轨道
| + 轨道
| + 轨道编号: 1 (mkvmerge & mkvextract 的轨道 ID: 0)
| + 轨道 UID: 1
| + 轨道类型: 视频
| + 「紧缩」 标记: 0
| + 语言: und
| + 编码格式 ID: V_MPEG4/ISO/AVC
| + 编解码器私有数据: 大小 42 (H.264 档次: High @L4.0)
| + 默认帧时长: 00:00:00.040000000 (对应视频轨的 25.000 帧/场每秒)
| + 语言 (IETF BCP 47): und
| + 视频轨道
| + 像素宽度: 1280
| + 像素高度: 720
| + 显示宽度: 1280
| + 显示高度: 720
| + 轨道
| + 轨道编号: 2 (mkvmerge & mkvextract 的轨道 ID: 1)
| + 轨道 UID: 782399382
| + 轨道类型: 音频
| + 「默认轨」 标记: 0
| + 语言: rus
| + 编码格式 ID: A_AC3
| + 默认帧时长: 00:00:00.032000000 (对应视频轨的 31.250 帧/场每秒)
| + 语言 (IETF BCP 47): ru
| + 名称: 俄语
| + 音频轨
| + 采样率: 48000
| + 声道数: 2
| + 轨道
| + 轨道编号: 3 (mkvmerge & mkvextract 的轨道 ID: 2)
| + 轨道 UID: 2887079607
| + 轨道类型: 音频
| + 「默认轨」 标记: 0
| + 语言: und
| + 编码格式 ID: A_AC3
| + 默认帧时长: 00:00:00.032000000 (对应视频轨的 31.250 帧/场每秒)
| + 语言 (IETF BCP 47): und
| + 名称: 原始语言
| + 音频轨
| + 采样率: 48000
| + 声道数: 2
|+ EBML void: 大小 1133
|+ 簇
在deepseek中输入提示词:
你是一个Python编程专家,完成如下任务:
读取这个文件夹中所有的mkv视频文件:“F:\aivideo”
根据 mkvinfo 输出,mkv视频文件中有三个轨道:
视频轨道(轨道编号 1)
音频轨道 1(轨道编号 2,AC3 格式,俄语)
音频轨道 2(轨道编号 3,AAC 格式,原始语言)
将默认音轨从音频轨道 1(轨道编号 2)调整为音频轨道 2(轨道编号 3)。
索引从 0 开始,所以 --default-track 1 对应音频轨道 1, --default-track 2 对应音频轨道 2,
"--default-track", "1:no", # 禁用音频轨道 1的默认音轨
"--default-track", "2:yes", # 启用音频轨道2的默认音轨
注意:每一步都要输出信息到屏幕上
mkvmerge 工具的路径为:D:\Program Files\MKVToolNix\mkvmerge.exe
subprocess.run 在读取 mkvmerge 的输出时,默认使用 gbk 编码解码,但输出中包含无法解码的字节。我们可以通过指定 encoding='utf-8' 来解决这个问题。
源代码:
import os
import subprocess
folder_path = r"F:\aivideo"
mkvmerge_path = r"D:\Program Files\MKVToolNix\mkvmerge.exe"
mkv_files = [f for f in os.listdir(folder_path) if f.endswith('.mkv')]
print(f"Found {len(mkv_files)} MKV files in the folder.")
for mkv_file in mkv_files:
file_path = os.path.join(folder_path, mkv_file)
print(f"Processing file: {file_path}")
command = [
mkvmerge_path,
"--output", file_path + ".tmp", # 输出到临时文件
"--default-track", "1:no", # 禁用轨道2的默认音轨
"--default-track", "2:yes", # 启用轨道3的默认音轨
file_path
]
print(f"Running command: {' '.join(command)}")
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, encoding='utf-8')
print(result.stdout)
print(result.stderr)
if result.returncode == 0:
os.remove(file_path)
os.rename(file_path + ".tmp", file_path)
print(f"Successfully processed file: {file_path}")
else:
print(f"Failed to process file: {file_path}")
print("All files processed.")