[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