Python mkvtoolnix批量删除音频曲目

Python mkvtoolnix批量删除音频曲目,python,audio,mkv,awk,Python,Audio,Mkv,Awk,我想在NAS上节省一些空间并删除不必要的磁道。 我发现 但是我的debian(nas操作系统)不支持mkvtoolnix 6.6.0及更高版本 描述了我的输出。 脚本使用新的输出 我认为剧本中的“音频”必须重新定义以适应我的需要 AUDIO_RE = re.compile(r"Track ID (\d+): audio \([A-Z0-9_/]+\) [language:[a-z]{3}?") 这就是我到目前为止得到的。。。但是剧本不起作用 我能做什么呢?我用一种旧的Unix脚本语言编写

我想在NAS上节省一些空间并删除不必要的磁道。 我发现 但是我的debian(nas操作系统)不支持mkvtoolnix 6.6.0及更高版本

描述了我的输出。 脚本使用新的输出

我认为剧本中的“音频”必须重新定义以适应我的需要

AUDIO_RE    = re.compile(r"Track ID (\d+): audio \([A-Z0-9_/]+\) [language:[a-z]{3}?")
这就是我到目前为止得到的。。。但是剧本不起作用

我能做什么呢?

我用一种旧的Unix脚本语言编写了脚本,该语言也可用于。我想,你可以得到一个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
    
  • 没有音频,没有潜艇,只有章节

     awk -f script.awk video.mkv :eng "" chapters
    
    awk -f script.awk video.mkv "" "" chapters
    

在每种语言代码前面放一个冒号
。一些有效代码是:

English language name | ISO639-2 code ----------------------------------------------+--------------- Afrikaans | afr Arabic | ara Australian languages | aus Baltic languages | bat Catalan; Valencian | cat Caucasian languages | cau Chinese | chi Corsican | cos Croatian | hrv Czech | cze Dutch; Flemish | dut English | eng French | fre Georgian | geo German | ger Greek, Modern (1453-) | gre Hebrew | heb Hindi | hin Hungarian | hun Irish | gle Italian | ita Japanese | jpn Javanese | jav Korean | kor Kurdish | kur Norwegian | nor Persian | per Polish | pol Portuguese | por Romanian; Moldavian; Moldovan | rum Russian | rus Serbian | srp Spanish; Castillan | spa Swedish | swe Thai | tha Turkish | tur Ukrainian | ukr Vietnamese | vie Walloon | wln Yiddish | yid
  • Unix(?)


    • 窗户

      Result=("\""MKVMerge"\" --ui-language en --identify-verbose \""MKVVideo"\"" | getline Line);
      
      Result=system("\"" MKVMerge "\" -o \"" NewVideo "\" " CommandLine " \"" MKVVideo "\"")
      
    • Unix(?)

    如果你知道另一个/更好/正确的Unix报价,请告诉我


    script.awk
    开始{
    MKVMerge=“/bin/MKVMerge”#适用于Linux
    MKVMerge=“C:\\Program Files\\mkvtoolnix\\MKVMerge.exe”#用于Win32
    MKVMerge=“C:\\Program Files(x86)\\mkvtoolnix\\MKVMerge.exe”#用于Win64
    FS=“[\t\n:]”
    IGNORECASE=1
    MKVVideo=ARGV[1]
    AudioKeep=ARGV[2]
    SubsKeep=ARGV[3]
    ChaptersKeep=ARGV[4]
    NewVideo=substr(MKVVideo,1,长度(MKVVideo)-4)“.new.mkv”
    做{
    结果=(“\”MKVMerge“\”--ui语言en--Identification verbose\”MKVVideo“\”getline);
    如果(结果>0){
    FieldCount=拆分(行、字段)
    如果(字段[1]=“轨迹”){
    诺特++
    磁道[NoTr,“id”]=字段[3]
    轨迹[NoTr,“典型”]=字段[5]
    对于(i=6;i0)
    如果(NoTr==0){
    打印“错误!在\”“MKVVideo”“中找不到曲目”
    出口
    }否则{print“\”MKVVideo“\”:“,NoTr,“tracks found.”
    对于(i=1;i1)打印“错误”结果“muxing\”“MKVVideo”\!”
    }
    
    您可以下载mkvtoolnix的旧版本。您不能将“原始”版本的脚本与您的工作mkvtoolnix一起使用吗?如果您需要,我可能会在未来几天更准确地研究它。这是实际的问题-我有mkvtoolnix的旧版本,并且由于我使用debian 3.2 backport,我一直在使用它。因此我需要“AUDIO_RE”适合我以前的输出曲目ID 2:AUDIO(A_AAC)[语言:eng Track_name:HE-AAC\s50-70 default_Track:0 forced_Track:0]请告诉我,您使用的是什么mkvtoolnix版本。我可以在Windows环境中使用python。因此,请将
    mkvmerge--ui language en--标识详细视频.mkv
    打包(zip,rar,tar…)到dropbox或其他文件宿主(pastebin无效)。我知道了。我还需要一些时间,现在是圣诞节,你知道:)
    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"\"!"
    }