mkvtoolnix批量删除音频曲目

2024-05-29 06:12:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在我的NAS上节省一些空间并删除不必要的磁道。 我找到了this Script 但是我的debian(nas os)不支持mkvtoolnix 6.6.0及更高版本

我的输出被描述为here at "old output"。 脚本使用新的输出

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

AUDIO_RE    = re.compile(r"Track ID (\d+): audio \([A-Z0-9_/]+\) [language:[a-z]{3}?")

这就是我目前所得到的。。。但是剧本不起作用

我能做什么?在


Tags: 版本脚本hereosscript空间debianthis
1条回答
网友
1楼 · 发布于 2024-05-29 06:12:06

我用编写脚本,这是一种旧的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
    

在每个语言代码前面加一个冒号:。一些有效代码包括:

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

请将完整的PATH设置为变量MKVMerge中的MKVToolnix分布。


在Windows和Unix中,需要注意不同的报价:

  • 窗口

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

    Result=("'MKVMerge'  ui-language en  identify-verbose 'MKVVideo'" | getline Line);
    

  • 窗口

    Result=system("\"" MKVMerge "\" -o \"" NewVideo "\" " CommandLine " \"" MKVVideo "\"")
    
  • Unix(?)在

    Result=system("'MKVMerge' -o 'NewVideo' CommandLine 'MKVVideo'")
    

如果您知道其他/更好/正确的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"\"!"
}

相关问题 更多 >

    热门问题