[MPlayer-users] [LONG] Problem using Mencoder 0.90 from a Perl Script for Neutrino/grab
Juergen Sauer
juergen.sauer at automatix.de
Wed Jul 9 20:21:44 CEST 2003
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Moin !
I got a small/big problem using mencoder out of Perl.
I wrote a perl script to automate avi transcodings for my harddisk recordings,
gabbed from a neutrino host. The recorded files are MPEG2/PES.
The intended use is as automated daemon to fully automated encode
the recordings. Locked against multiple calls/overwriting file etc.
This is my recognized problem:
The mencoder breaks the output file, if I close STDIN, STDOUT, STDERR
I marked the problem parts in the Script like this
############# XXX ################
Any idea, whats wrong here ?
TIA
Jojo
##########################################################################
### Here my perl Program, who want to use it, take it.
#!/usr/bin/perl
##########################################################################
#
# Globale Parameter
#
# Aufzeichnungsverzeichnis der DBOX2
$DBOX="/video/dbox2";
# Dies sind Serien, die sonst tgl. überschrieben werden
@SERIEN=("Mit_Schirm,_Charme_und_Melone","MacGyver", "Kung_Fu:_Im_Zeichen_des_Drachen", "Babylon_5", "Captain_Future", "Raumschiff_Enterprise_-_Das_nächste_Jahrhundert","Wickie");
# Dies ist das Zielverzeichnis
$MPGDIR="/video/dbox2/filme";
# Transcoder Programm
@TRANSCODER=("/usr/bin/transcode", "-I3", "-J", "32detect=resample", "-w", "1800,250,100", "-E", "44100", "-f", "25", "-y", "divx5", "-V", "-q", "0");
@CLEANUP=("/usr/bin/mencoder", "-oac", "copy", "-ovc", "copy");
$AVIDIR="/video/dbox2/filme/avi";
$PROBLEM="/video/dbox2/filme/problem";
$TRANSPID="/var/run/transcode.pid";
# Diese DIRS sind zu ignorieren:
@NICHTDIRS=("pc1","server-1","server-2","server-3","filme", "rip");
# Diese Anzahl an Stunden muß gewartet werden, bevor ein Dir angefasst wird
$STUNDEN=3;
# Diese Anzahl an Stunden muß gewartet werden, bevor ein AVI encoded wird
$ASTUNDEN=1;
$PID=$$;
$PIDFILE="/var/run/dbox2-cleanup.pid";
$LOGFILE="/var/log/dbox2-clean.log";
$BUFFERSIZE=1024*1024*100;
$BITRATE=1800;
@XVIDENCODE = ("mencoder", "-oac", "mp3lame", "-lameopts", "cbr:br=128:q=3:mode=1", "-ovc", "xvid", "-xvidencopts", "bitrate=$BITRATE:me_quality=6");
@DIVXENCODE = ("mencoder", "-oac", "mp3lame", "-lameopts", "cbr:br=128:q=3:mode=1", "-ovc", "lavc", "-lavcopts", "vbitrate=$BITRATE:keyint=250:aspect=4/3");
@TRANSCODE=("transcode", "-I3", "-J", "32detect=resample", "-w", "$BITRATE,250,100", "-E", "44100", "-f", "25", "-y", "divx5", "-V", "-i", "$1", "-o", "/video/dbox2/filme/avi/$OUT");
################################################################
open LOG, '>>', $LOGFILE;
if(-f $PIDFILE)
{
print LOG "$PIDFILE existiert - Abbruch\n";
close LOG;
exit 1;
}
################################################################
use File::Copy;
use File::Path;
use File::Basename;
################################################################
################################################################
#
# Rekursive Routine: Direktory und alle Subdirs einlesen
#
sub direktory_lesen
{
my $d=shift;
my @l;
# print "Lese Dir: $d\n";
opendir DH, $d;
my @ff=readdir(DH);
foreach(@ff)
{
chomp($_);
my $f=$_;
next if(/^\./ or /^\.\./); # Skip "." und ".." Einträge
my $test="$d/$f";
@l=(@l, $test) if( -f $test);
# @l=(@l, direktory_lesen($test)) if( -d $test);
}
closedir DH;
return(@l);
}
################################################################
#
# Testen, ob ein Verz. in der "Ignorier-Mich" Liste ist
#
sub test_ignore
{
my $d=shift;
foreach(@NICHTDIRS)
{
return 1 if ($_ eq $d);
}
return(0);
}
################################################################
#
# Testen, ob ein Verz. in der "Ignorier-Mich" Liste ist
#
sub test_serie
{
my $d=shift;
foreach(@SERIEN)
{
return 1 if ($_ eq $d);
}
return(0);
}
sub aufzeichnung_bearbeiten
{
my $d=shift;
my $file=$d."1.mpg";
my $neu="$MPGDIR/$d.mpg";
chdir($d) or return;
my $count=2;
my $BUFFER;
while(-f $neu)
{
$neu="$MPGDIR/$d-$count.mpg";
$count++;
}
$neutmp="$neu.tmp";
move ($file,$neutmp);
open OUT, '>>', $neutmp;
binmode OUT;
my $cf="$d$count.mpg";
while(-f $cf)
{
open IN, $cf;
binmode IN;
while(! eof(IN))
{
$bytes=read IN, $BUFFER, $BUFFERSIZE;
syswrite OUT, $BUFFER, $bytes;
}
close IN;
unlink($cf);
$count++;
$cf="$d$count.mpg";
}
close OUT;
chdir ("..");
rmdir ($d);
@action=(@CLEANUP, "-o", $neu, $neutmp);
system(@action);
unlink $neutmp ;
}
################################################################
# 1. Turnusmäsig nachsehen in $DBOX, mindest Alter $STUNDEN
# 1.1. Testen, ob $MPGDIR in $DBOX liegt, dann nicht beachten
############# XXX ################
# close(STDIN);
# close(STDOUT);
# close(STDERR);
############# XXX ################
@chown=("chown", "-R", "jojo.video", ".");
system(@chown);
chdir $DBOX or die "Fehler beim öffenen von $DBOX\n";
opendir DH, $DBOX or die "Fehler beim öffenen von $DBOX\n";
@db2=readdir(DH) or die "Fehler beim Lesen von $DBOX\n";
closedir(DH);
open PID, '>', $PIDFILE;
print PID "$$\n";
close PID;
# system("sleep","20");
foreach(@db2)
{
# print "Datei: $_\n";
next if(/^\./ or /^\.\./); # Skip "." und ".." Einträge
next if(-l $_);
next if(-f $_);
next if(test_ignore($_));
$dir=$_;
chdir $DBOX;
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($dir);
next if($mtime > time-$STUNDEN*3600);
if(test_serie($_))
{
# 2. Serien Verzeichniss auflösen
$dir=$_;
# print "Serie: $dir\n";
$n=1;
$neu=$dir."-$n";
while(-f $neu or -d $neu or -l $neu)
{
$n++;
$neu=$dir."-$n";
}
move ($dir, $neu);
print LOG "move $dir $neu\n";
chdir $DBOX."/$neu";
my @sl=direktory_lesen(".");
foreach(@sl)
{
my $sd=$_;
$sd =~ s/$dir/$neu/g;
move($_, $sd);
}
@db2=(@db2, $neu);
}
else
{
# 3. Verzeichnisse mit Filmen Auflösen, bewegen nach: $MPEGDIR
$dir=$_;
print LOG "Bearbeite $dir\n";
aufzeichnung_bearbeiten($_);
}
}
close LOG;
unlink($PIDFILE);
# 4. Transcoder anwerfen (Wenn nicht laufend und Arbeit da)
if(! -f $TRANSPID)
{
if(!fork())
{
############# XXX ################
# This breaks up outputfiles:
# close(STDIN);
# close(STDOUT);
# close(STDERR);
############# XXX ################
open PID, '>', $TRANSPID;
print PID "$$\n";
close PID;
open LOG, '>>', $LOGFILE;
STDOUT=LOG;
if(! -d $AVIDIR)
{
print LOG "Problem: $AVIDIR existiert nicht\n";
beenden;
}
if(! -d $PROBLEM)
{
print LOG "Problem: $PROBLEM existiert nicht\n";
beenden;
}
my @liste=direktory_lesen($MPGDIR);
foreach(@liste)
{
next if(! /\.mpg\Z/);
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($_);
next if($mtime > time-$ASTUNDEN*3600); # Erstmal $ASTUNDEN Ruhen
# next if(! /\/aaa\.mpg\Z/);
my $in ="$_";
# Bestimmen des Ausgabe AVI Namens
my $out="$AVIDIR/".basename($_,".mpg");
if(-f "$out.avi")
{
$n=1;
$neu=$out."-$n".".avi";
while(-f $neu or -d $neu or -l $neu)
{
$n++;
$neu=$out."-$n".".avi";
}
$out=$neu;
}
else
{
$out="$out.avi";
}
print LOG localtime(time)." Transcode: $in => $out ... ";
############# XXX ################
my @ex=(@DIVXENCODE, "-o", $out, $in);
if(eval(system(@ex)))
{
@ex=(@XVIDENCODE, "-o", $out, $in);
if(eval(system(@ex)))
{
print LOG "Fehler: $fehler @ex\n";
move ($in, $PROBLEM);
}
}
else
{
print LOG ("ok $dauer s ".localtime(time)."\n");
unlink($in);
}
}
unlink($TRANSPID);
}
}
beenden;
###
sub beenden
{
unlink($TRANSPID);
exit 0;
}
mfG
Jürgen
automatiX Linux Support Crew
- --
Jürgen Sauer - AutomatiX GmbH, +49-4209-4699, jojo at automatix.de **
** Das Linux Systemhaus - Service - Support - Server - Lösungen **
** http://www.automatix.de ICQ: #344389676 **
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)
iD8DBQE/DF07W7UKI9EqarERAmp1AJsGYiHHQWXNRCbwxMkRq4jA49wPwgCfXr8F
Gpk8Ttcv1HUoqc2EidJ0wJ8=
=2CjK
-----END PGP SIGNATURE-----
More information about the MPlayer-users
mailing list