我用awk编写了脚本,这是一种旧的 Unix 脚本语言,也可用于Windows。我想,你可以得到一个 Debian awk 包。
用法:
awk -f script.awk [video.mkv] [audio-langs-to-keep] [subtitle-langs-to-keep] [keep-chapters]
例子:
保留英语和西班牙音频,保留法语和德语字幕,无章节
awk -f script.awk video.mkv :eng:spa :fre:ger
保留英文音频,没有字幕,保留章节
awk -f script.awk video.mkv :eng "" chapters
不保留音频,没有字幕,但章节
awk -f script.awk video.mkv "" "" chapters
在每个语言代码前加一个冒号:
。一些有效的代码是:
英文名称 | ISO639-2 代码
----------------------------------------------+--- ------------
南非荷兰语 | 非洲
阿拉伯语 | 阿拉
澳大利亚语言 | 澳大利亚
波罗的海语言 | 蝙蝠
加泰罗尼亚语;巴伦西亚 | 猫
高加索语言 | 考
中文 | 志
科西嘉 | 因
克罗地亚语 | hrv
捷克语 | 捷克
荷兰语;佛兰芒语 | 义务
英语 | 英文
法语 | 自由
格鲁吉亚 | 地理
德语 | 格尔
现代希腊语 (1453-) | 格雷
希伯来语 | 希伯来
印地语 | 欣
匈牙利语 | 匈奴
爱尔兰语 | 乐
意大利语 | 伊塔
日语 | 日本
爪哇语 | 熟
韩语 | 科尔
库尔德语 | 库尔
挪威语 | 也不
波斯语 | 每
波兰语 | 波尔
葡萄牙语 | 波尔
罗马尼亚语;摩尔达维亚; 摩尔多瓦 | 朗姆酒
俄语 | 罗斯
塞尔维亚语 | srp
西班牙语; 卡斯蒂利亚 | 温泉
瑞典语 | 瑞典
泰语 | 塔
土耳其语 | 转
乌克兰语 | 乌克兰
越南语 | 争夺
瓦隆 | wln
意第绪语 | yid
请PATH
在变量中设置完整的 MKVToolnix 分布MKVMerge
。
Windows 和 Unix 中的不同引用需要注意:
如果您知道另一个/更好/正确的 Unix 引用,请告诉我。
script.awk
BEGIN {
MKVMerge="/bin/MKVMerge" # for Linux
MKVMerge="C:\\Program Files\\mkvtoolnix\\MKVMerge.exe" # for Win32
MKVMerge="C:\\Program Files (x86)\\mkvtoolnix\\MKVMerge.exe" # for Win64
FS="[\t\n: ]"
IGNORECASE=1
MKVVideo=ARGV[1]
AudioKeep=ARGV[2]
SubsKeep=ARGV[3]
ChaptersKeep=ARGV[4]
NewVideo=substr(MKVVideo, 1, length(MKVVideo)-4)".new.mkv"
do {
Result=("\""MKVMerge"\" --ui-language en --identify-verbose \""MKVVideo"\"" | getline Line);
if (Result>0) {
FieldCount=split(Line, Fields)
if (Fields[1]=="Track") {
NoTr++
Track[NoTr, "id"]=Fields[3]
Track[NoTr, "typ"]=Fields[5]
for (i=6; i<=FieldCount; i++) {
if (Fields[i]=="language") Track[NoTr, "lang"]=Fields[++i]
}
}
}
} while (Result>0)
if (NoTr==0) {
print "Error! No tracks found in \""MKVVideo"\"."
exit
} else {print "\""MKVVideo"\":", NoTr, "tracks found."}
for (i=1; i<=NoTr; i++) {
if (Track[i, "typ"]=="audio") {
if (AudioKeep~Track[i, "lang"]) {
print "Keep", Track[i, "typ"], "Track", Track[i, "id"], Track[i, "lang"]
if (AudioCommand=="") {AudioCommand=Track[i, "id"]
} else AudioCommand=AudioCommand","Track[i, "id"]
} else {
print "\tRemove", Track[i, "typ"], "Track", Track[i, "id"], Track[i, "lang"]
}
} else {
if (Track[i, "typ"]=="subtitles") {
if (SubsKeep~Track[i, "lang"]) {
print "Keep", Track[i, "typ"], "Track", Track[i, "id"], Track[i, "lang"]
if (SubsCommand=="") {SubsCommand=Track[i, "id"]
} else SubsCommand=SubsCommand","Track[i, "id"]
} else {
print "\tRemove", Track[i, "typ"], "Track", Track[i, "id"], Track[i, "lang"]
}
}
}
}
if (AudioCommand=="") {CommandLine="-A"
} else {CommandLine="-a "AudioCommand}
if (SubsCommand=="") {CommandLine=CommandLine" -S"
} else {CommandLine=CommandLine" -s "SubsCommand}
if (!ChaptersKeep) CommandLine=CommandLine" --no-chapters"
print "\"" MKVMerge "\" -o \"" NewVideo "\" " CommandLine " \"" MKVVideo "\""
Result=system("\"" MKVMerge "\" -o \"" NewVideo "\" " CommandLine " \"" MKVVideo "\"")
if (Result>1) print "Error "Result" muxing \""MKVVideo"\"!"
}