2016-11-20 117 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