#!/bin/sh # eli2mpg # Umrechnung einer Quicktime-Schnitt-Protokolldatei (aus glav) # in generisches MPEG2-Format # Benötigt: mjpeg-tools, toolame, time # Version: 1.3.1 # 1. Mai 2005 # Changelog von 1.3.0 zu 1.3.1: # Hinweis zur angelegten Klangrohdaten-Datei korrigiert #------------------------------------------------------------------ # Name des Skriptes: PROG=`basename $0` ELISUFFIX=eli LOGSUFFIX=log AUDIOSUFFIX=mp2 VIDEOSUFFIX=m2v ENDSUFFIX=mpg TIMEBEFEHL="/usr/bin/time" if [ ! -x $TIMEBEFEHL ]; then echo echo "$PROG kann $TIMEBEFEHL nicht ausführen." echo "Editiere $PROG, und ändere den Parameter TIMEBEFEHL, so dass er auf den time-Befehl zeigt (time ggf. installieren)." echo "Hinweis: Es wird die Programmdatei time benötigt, kein Shell-interner time-Befehl." echo exit 1 fi # zwei, drei oder vier Paramter übergeben? if [ $# -ne 2 -a $# -ne 3 -a $# -ne 4 ]; then echo echo "Benutzung: $PROG [denoise [deinterlace]]" echo echo " Editier-Protokolldatei von glav" echo echo Mögliche Verfahren: echo -e "vhs\t\t Quelle: VHS-Kassette" echo -e "dvb\t\t Quelle: Digitalfernsehen" echo -e "schnell\t\t schneller statt besser" echo echo -e "denoise\t\t Entrausche (für VHS empfohlen)" echo echo -e "deinterlace\t Führe Deinterlacing durch (manchmal notwendig, mindert die Güte)" echo echo "Im aktuellen Verzeichnis werden folgende Dateien erzeugt:" echo -e "$PROG..[.denoise[.deinterlace]].$LOGSUFFIX \t Logdatei" echo -e "$PROG..$AUDIOSUFFIX \t MPEG2-Klangrohdaten" echo -e "$PROG..[.denoise[.deinterlace]].$VIDEOSUFFIX \t MPEG2-Bildrohdaten" echo -e "$PROG..[.denoise[.deinterlace]].$ENDSUFFIX \t MPEG2-Ergebnisdatei" echo exit 1 fi ELIDATEI=$1 if [ ! -r $ELIDATEI ]; then echo "eli-Datei \"$ELIDATEI\" nicht lesbar" exit 1 fi # vorläufig: ENDPRAEFIX=`basename $ELIDATEI $ELISUFFIX` # endgültig: # Die Audio-Datei unterscheidet sich nicht nicht nach Verfahren/Option dvd AUDIOPRAEFIX=$ENDPRAEFIX TYP="$2" TYP_KORREKT=0 for i in schnell dvb vhs do if [ "$i" = "$TYP" ]; then TYP_KORREKT=1 fi done if [ $TYP_KORREKT -eq 0 ]; then echo "Als Verfahren kann angegeben werden:" echo vhs echo dvb echo schnell exit 1 fi # Standardmäßig kein Denoising und kein Deinterlacing: DN=0 DI=0 # Optionale Parameter: O1="$3" O2="$4" # Option 1: denoise? if [ "$O1" ]; then if [ "$O1" = "denoise" ]; then DN=1 else echo "Als erster optionaler Parameter kann denoise angegeben werden, nichts sonst." exit 1 fi # Option 2: deinterlace? if [ "$O2" ]; then if [ "$O2" = "deinterlace" ]; then DI=1 else echo "Als zweiter optionaler Parameter kann deinterlace angegeben werden, nichts sonst." exit 1 fi fi fi ######################################################## # Ab hier gelten die Parameter als in Ordnung ######################################################## ENDPRAEFIX=$ENDPRAEFIX$TYP. if [ $DN -eq 1 ]; then ENDPRAEFIX=$ENDPRAEFIX"denoise." fi if [ $DI -eq 1 ]; then ENDPRAEFIX=$ENDPRAEFIX"deinterlace." fi LOGPRAEFIX=$PROG.$ENDPRAEFIX LOGDATEI=$LOGPRAEFIX$LOGSUFFIX AUDIODATEI=$AUDIOPRAEFIX$AUDIOSUFFIX VIDEODATEI=$ENDPRAEFIX$VIDEOSUFFIX ENDDATEI=$ENDPRAEFIX$ENDSUFFIX # Temoräre Logdatei für time, wird nach Gebrauch gelöscht: # $$ = PID TEMP_LOG="/tmp/mpeg2enc_zeit$$.log" ####################### echo "---------- Befehl -----------------------" > $LOGDATEI echo "$PROG $*" >> $LOGDATEI echo >> $LOGDATEI ####################### ################## # toolame ################## # Umwandlung von wav in das mpeg-2-Klangformat: # MP2-Datei schon vorhanden? Muss dann nicht neu enkodiert werden BESTVERWENDEN=0 if [ -e "$AUDIODATEI" ]; then IOKORREKT=0 while [ $IOKORREKT -eq 0 ]; do echo -n "Audio-Datei \"$AUDIODATEI\" ist bereits vorhanden. Soll die bestehende Datei beibehalten werden (j/n) ? " read x case $x in [jJ] ) IOKORREKT=1 ; BESTVERWENDEN=1 ;; [nN] ) IOKORREKT=1 ;; esac done fi # Logdatei schreiben: echo ---------- toolame ----------------- >> $LOGDATEI date >> $LOGDATEI echo >> $LOGDATEI if [ $BESTVERWENDEN -eq 0 ]; then BEFEHL="lav2wav $ELIDATEI | toolame -b 224 -p 2 -s 48 -m s - $AUDIODATEI" echo $BEFEHL >> $LOGDATEI echo "------------------------------------------------------------" echo "Führe aus: $BEFEHL" eval $BEFEHL # lav2wav meldet immer den Fehler "can not rewind wav file". # Da es hier um stdin geht, ist der Fehler jedoch nonrelevant. else echo "Bestehende Audio-Datei \"$AUDIODATEI\" wird beibehalten" >> $LOGDATEI fi echo >> $LOGDATEI ##################### # mpeg2enc ##################### BEFEHL="$TIMEBEFEHL --output=$TEMP_LOG --format="%E" nice -n 17 lav2yuv $ELIDATEI |" # "Deinterlace the stream with yuvdenoise -F" # (Quelle: https://sourceforge.net/docman/display_doc.php?docid=3456&group_id=5776") # Standardmäßig wird mit mpeg2enc interlaced kodiert: DIMODE=1 if [ $DN -eq 1 ]; then BEFEHL="$BEFEHL yuvdenoise" if [ $DI -eq 1 ]; then BEFEHL="$BEFEHL -F" DIMODE=0 fi BEFEHL="$BEFEHL |" fi # Grundbefehl für alle Typen: # --format 3 = generisches MPEG-2-Format # --video-norm p = PAL # -frame-rate 3 = 25 Bilder/s # --aspect 2 = 4:3 (default) # -N gibts nicht mehr # --closed-gop geht nicht, muss -c genommen werden BEFEHL="$BEFEHL mpeg2enc --format 3 --aspect 2 --video-norm p --frame-rate 3 --force-b-b-p --video-buffer 500 -c --output $VIDEODATEI" # Verfahrensabhängige Parameter: # --video-bitrate 7500 ist default für DVD # --interlace-mode 1 benötigt doppelte Zeit . Wenn VHS mit yuvdenoise -F schon deinterlaced wurde, kann hier -I 0 gesetzt werden. # Da sowohl dvb-t als auch vhs interlaced Siganle sind, sollte auch interlaced # abgespeichert werden, da sonst Informationen verloren gehen. # Interlaced Material ist nur auf TV-Gerät anzuschauen, am PC sind Streifen zu sehen. # q2 oder q4 macht keinen Zeitunterschied aus, q2-Datei ist aber 50% größer als q4 # Quantisation(q) kleiner als 4 ist extrem und soll laut mjpegtools-Doku nicht verwendet werden if [ $TYP = "schnell" ]; then PARAMETER="--video-bitrate 7500 --quantisation 7" elif [ $TYP = "dvb" ]; then PARAMETER="--video-bitrate 9000 --quantisation 4 --reduction-2x2 1 --reduction-4x4 1 -I $DIMODE --keep-hf" elif [ $TYP = "vhs" ]; then PARAMETER="--video-bitrate 9000 --quantisation 4 --reduction-2x2 1 --reduction-4x4 1 -I $DIMODE" else echo Kein gültiger Typ angegeben. exit 1 fi BEFEHL="$BEFEHL $PARAMETER 2>&1 > /dev/null | tee --append $LOGDATEI" # 2>&1 > /dev/null | tee --append $LOGDATEI bedeutet, nur stderr loggen # Befehl in Logdatei schreiben: echo ---------- mpeg2enc ---------------- >> $LOGDATEI date >> $LOGDATEI echo >> $LOGDATEI echo -e "$BEFEHL" >> $LOGDATEI echo >> $LOGDATEI # Befehl ausführen eval $BEFEHL echo "------ mpeg2enc-Zeit ----------------" >> $LOGDATEI cat $TEMP_LOG >> $LOGDATEI echo >> $LOGDATEI rm $TEMP_LOG echo =============================================== echo mplex echo =============================================== ############## # mplex ############## # Parameter --mux-limit beschränkt mplex auf Sekunden Dauer BEFEHL="mplex --verbose 1 -V -b 500 --format 3 --output $ENDDATEI $VIDEODATEI $AUDIODATEI" # -V = variable Bitbreite # -b = buffer size # Befehl in Logdatei schreiben: echo ---------- mplex ---------------- >> $LOGDATEI date >> $LOGDATEI echo >> $LOGDATEI echo "$BEFEHL" >> $LOGDATEI echo >> $LOGDATEI # Befehl ausführen: $BEFEHL