2016-11-20 55 views
0

我的腳本的第一部分詢問是否檢查cinavia不起作用。也就是說,如果我輸入「y」或「Y」,則不會進入CNVIACHk功能,而是進入MVIEPARAMs功能。Perl和ffmpeg腳本

# GET FILE INPUT.. 

print "Enter Filename.."; 
my $MOVIe = <STDIN>; 

print "Check For Cinavia? Enter y or n\n"; 
my $CNVIAQUESt = <STDIN>; 

if ($CNVIAQUESt eq "y" || $CNVIAQUESt eq "Y") { 
    CNVIACHk($MOVIe); 
} 
else { 
    MVIEPARAMs($MOVIe); 
} 


sub MVIEPARAMs { 

    system(
     "ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 $MOVIe" 
    ); 

    print "Duration In Seconds.."; 
    $DURATIOn = <STDIN>; 

    system(
     'ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width "$MOVIe"' 
    ); 

    print "Movie Width? "; 
    $MOVIEWIDTh = <STDIN>; 

    print "Movie Height? "; 
    $MOVIEHEIGHt = <STDIN>; 

    print "Enter Target Width.. "; 
    $TARGETWIDTh = <STDIN>; 

    print "Enter Target Height.. "; 
    $TARGETHEIGHt = <STDIN>; 

    system(
     'ffprobe -show_entries stream=index,codec_type:stream_tags=language -of compact "$MOVIe" -v 0 | grep eng' 
    ); 

    print "Enter number of English Audio Track.. "; 
    $ENGAUDTRk = <STDIN>; 

    print "English Audio Track Number Is ", $ENGAUDTRk, "."; 
    $BTRTe = 31875072/$DURATIOn; 

    DETRMNEPAd; 
} 


sub DETRMNEPAd { 

    if ($MOVIEWIDTh < $TARGETWIDTh) { 
     $X = $TARGETWIDTh - $MOVIEWIDTh/2; 
    } 
    elsif ($MOVIEHEIGHt < $TARGETHEIGHt) { 
     $Y = $TARGETHEIGHt - $MOVIEHEIGHt/2; 
     $X = 0; 
     print $Y; 
    } 
    else { 
     print "Padding Not Needed Moving On..."; 
     CNVRTWOPAd(); 
    } 

    CNVRTWPAd(); 
} 


sub CNVIACHk { 

    print "Checking Movie For Cinavia.. "; 
    system("cinde -i $MOVIe -q high -l"); 

    print "Enter Track To Check.. "; 
    $TRKTOCHEk = <STDIN>; 

    system("cinde -i $MOVIe -q high -t $TRKTOCHEk"); 

    print "Was Cinavia Detected?"; 
    $CNVIACHKANSr = <STDIN>; 

    if ($CNVIACHKANSr eq "y") { 
     exit; 
    } 
    else { 

     print "Would You Like To Check Another Track?"; 
     $CHKANTHRTRk = <STDIN>; 

     if ($CHKANTHRTRk eq "y") { 
      CNVIACHk(); 
     } 
     else { 
      MVIEPARAMs(); 
     } 
    } 
} 


sub CNVRTWOPAd { 

    print "BEGINNING CONVERSION...\n"; 

    print "What Preset Would You Like To Use?"; 
    $PRESEt = <STDIN>; 

    system(
     "ffmpeg -i $MOVIe -map 0:0 -map 0:$ENGAUDTRk -c:v libx264 -b:v $BTRTe -preset $PRESEt -strict -2 -c:a ac3 -b:a 192k -threads 12 -pass 1 -f matroska dummy && ", 
     "ffmpeg -i $MOVIe -map 0:0 -map 0:$ENGAUDTRk -c:v libx264 -b:v $BTRTe -preset $PRESEt -strict -2 -c:a ac3 -b:a 192k -threads 12 -pass 2 -f matroska ENCODE1.mkv" 
    ); 
} 


sub CNVRTWPAd { 

    print "BEGINNING CONVERSION...\n"; 

    print "What Preset Would You Like To Use?"; 
    my $PRESEt = <STDIN>; 

    system(
     "ffmpeg -i $MOVIe -map 0:0 -map 0:$ENGAUDTRk -c:v libx264 -b:v $BTRTe -preset $PRESEt -vf \"pad=$TARGETWIDTh:$TARGETHEIGHt:$X:$Y:black\" -strict -2 -c:a ac3 -b:a 192k ", 
     " -threads 12 -pass 1 -f matroska dummy && ffmpeg -i $MOVIe -map 0:0 -map 0:$ENDAUDTRk -c:v libx264 -b:v $BTRTe -preset $PRESEt -vf \"pad=$TARGETWIDTh:$TARGETHEIGHt:$X:$Y:black\"", 
     " -strict -2 -c:a ac3 -b:a 192k -threads 12 -pass 2 -f matroska ENCODE1.mkv" 
    ); 
} 
+4

這是一個奇怪的方法來命名您的VARIABLEs。 – LordNeckbeard

+0

是的,我喜歡allcaps,但不知道它是否安全.. – armight29

+3

你應該遵循你正在使用的編程語言的指導原則。通常,Perl詞法變量使用小寫字母和'snake_case',全局變量採用大寫字母,模塊和包名稱的首字母大寫爲'Like :: This'。看看['perldoc perlstyle'](http://perldoc.perl.org/perlstyle.html) 你還必須在你編寫的每個Perl程序的頂部使用'strict'和''warning all'' ,並用'my'聲明所有變量儘可能接近它們的第一個使用點。 – Borodin

回答

2
my $CNVIAQUESt=<STDIN>; 
if($CNVIAQUESt eq "y" || $CNVIAQUESt eq "Y") { 

yY後,按回車。這是輸入的一部分,所以其實$CNVIAQUESt eq "y\n"。要從值中刪除換行符,請使用

chomp $CNVIAQUESt; 

讀取輸入後。詳情請參閱chomp

+0

非常感謝:) – armight29

+1

這就是你應該爲所有其他人做的事情從讀取後的變量 – vanHoesel