Dvb script gui/scriptcode
Achtung dieser Artikel ist noch in Arbeit und dient vorläufig nur als Vorlage. Dieser Beitrag zu Linux oder der Abschnitt ist in Bearbeitung. Weitere Informationen findest du hier. Der Ersteller arbeitet an dem Beitrag oder Abschnitt und entsorgt den Wartungsbaustein spätestens 3 Tage nach der letzten Bearbeitung. Änderungen außer Rechtschreibkorrekturen ohne Absprache mit dem Urspungsautor sind möglichst zu vermeiden, solange dieser Baustein noch innerhalb der genannten Frist aktiviert ist. |
Diese Beschreibung wurde mit folgenden Distributionen getestet: |
OpenSuse 11.0 (32Bit) mit KDE 3.9.x |
Vom DVB zur DVD, die GUI: Anleitungen - Installation - GUI-Kommanderscript - Arbeitsscript - Dokumentation |
#!/bin/bash #Name: dvb_script_gui_arbeitsscript #Version: 0.4.0 #Erstellungsdatum: 19.11.2009 #Autor: escho (www.linux-club.de) #Benutzung auf eigene Gefahr #Dieses Shell Script automatisiert weitgehend die Vorgänge, die nötig sind, um aus einer DVB-Aufnahme #eine abspielbare Video-DVD zu erzeugen. Es ist nur zusammen mit dem Installationsscript und dem GUI-Script lauffähig # ---------------------------------Vorbereitungen------------------------------------- # Übernahme von Kommander was_tun=`echo @Self.item(0)` # Voreinstellungen speed=8 #maximale Brenngeschwindigkeit dvdgroesse=4600000000 #festgelegte Grösse der DVD in Byte # Die Hilfsprogramme mplex=/usr/bin/mplex #Multiplexen dvdauthor=/usr/bin/dvdauthor #Dvd authorn normalize=/usr/bin/normalize #Ton auf definierten Pegel bringen ffmpeg=/usr/bin/ffmpeg #Spezielle mpeg-Bearbeitungsmöglichkeiten growisofs=/usr/bin/growisofs #Brennen tcrequant=/usr/bin/tcrequant #Requantisieren pjx=/daten/Programme/ProjectX/Aktuell/ProjectX.jar #ProjectX edgar # Verzeichnisse #°°°°Hauptverzeichnis°°°° hauptverzeichnis=~/DVB_Script #Hauptverzeichnis # °°°°Arbeitsverzeichnisse°°°° dvdstruktur=$hauptverzeichnis/dvdstruktur #fertige DVD-Struktur sicherung=$hauptverzeichnis/sicherung #Noch zu brennende DVD-Struktur bzw. TS tmp1=$hauptverzeichnis/tmp1 #temporärer Ordner tmp2=$hauptverzeichnis/tmp2 #temporärer Ordner konfiguration=$hauptverzeichnis/konfiguration #für die x.ini kommander=$hauptverzeichnis/kommander #Kommunikation mit der GUI # °°°°Verzeichnis für die Videoclips°°°° clip_verz=~/DVB_Videoclips # Überprüfung, ob die Hilfsprogramme installiert sind test=( $mplex $dvdauthor $normalize $ffmpeg $growisofs $tcrequant $pjx ) for var in ${test[*]} do if [ ! -e "$var" ] then kdialog --error "Das Hilfs-Programm $var wurde nicht gefunden. Bitte zuerst installieren" exit fi done # Anlegen der Verzeichnisstruktur if [ ! -e "$hauptverzeichnis" ] then mkdir $hauptverzeichnis mkdir $dvdstruktur mkdir $sicherung mkdir $tmp1 mkdir $tmp2 mkdir $kommander mkdir $konfiguration fi if [ ! -e "$clip_verz" ] then mkdir $clip_verz fi # Zugriffsdateien für das Debug- und das Fortschrittfenster anlegen (zur Anzeige in der GUI) touch $kommander/debug touch $kommander/fortschritt # Fehlermeldungen ins Debug-Fenster umleiten exec 2> $hauptverzeichnis/kommander/debug # ----------------------------------Funktionen------------------------------------- # °°°°Meldungen°°°° fortschrittfenster () { echo "$1" >> $kommander/fortschritt } fenster_leeren () { echo "" > $kommander/fortschritt echo "" > $kommander/debug } # °°°° Programmende °°°° programmende () { fortschrittfenster "Ende" kdialog --yesno "Programm beendet. Fensterinhalte löschen?" if [ $? = 0 ] then fenster_leeren fi exit } # °°°°Konfiguration°°°° konfiguration () { echo "X.ini für ProjectX erzeugen" echo \ "# Application Application.Agreement=1 Application.Language=de # CollectionPanel CollectionPanel.Preview.SliderWidth=0 # WindowPosition WindowPosition.Main.Width=9999 WindowPosition.Main.Y=0 # OptionPanel OptionPanel.NormalLog=0 OptionPanel.closeOnEnd=1" \ > $konfiguration/x.ini } arbeitsordner_leeren () { fortschrittfenster "Löschen tmp, kann etwas dauern ..." rm -r -- $tmp1/* 2>/dev/null rm -r -- $tmp2/* 2>/dev/null rm -r -- $dvdstruktur/* 2>/dev/null } # °°°°Auswahl Quelldateien°°°° filmauswahl () { fortschrittfenster "Quelldatei auswählen" case $was_tun in 11) brenn_pfad=$dvdstruktur ;; 12) brenn_pfad=$dvdstruktur ;; 21) brenn_pfad=$tmp1 ;; 22) brenn_pfad=$tmp1 ;; esac quelldatei=`kdialog --caption "Filmauswahl" --geometry 600x500-0+0 --getopenfilename ~` if [ $? != 0 ] then fortschrittfenster "Abbruch durch den Benutzer" programmende fi } verzeichnisauswahl () { fortschrittfenster "Quelldatei auswählen" case $was_tun in 13) verzeichnistyp="*_dvd" ;; 23) verzeichnistyp="*_ts" ;; esac anzahl_der_sicherungen=`find $sicherung/$verzeichnistyp -maxdepth 0 -type d | wc -l` hilfsverzeichnis=`find $sicherung/$verzeichnistyp -maxdepth 0 -type d` case $anzahl_der_sicherungen in 0) fortschrittfenster "Es gibt nichts passendes zum Brennen. Das Script wird nun beendet." programmende ;; 1) fortschrittfenster "$hilfsverzeichnis" verzeichnis=$hilfsverzeichnis ;; *) verzeichnis=`kdialog --combobox "Welche Datei soll gebrannt werden?" $hilfsverzeichnis` if [ $? != 0 ] then fortschrittfenster "Abbruch durch den Benutzer" programmende fi ;; esac brenn_pfad=$verzeichnis } # °°°°Eingangsverarbeitung°°°° # Schneiden und Demultiplexen pjx_demux_gui () { fortschrittfenster "ProjectX: Schneiden und demultiplexen" java -jar $pjx -demux -gui -ini $konfiguration/x.ini -out $tmp1 -name film "$quelldatei" } # Schneiden und Wandeln nach TS pjx_ts_gui () { fortschrittfenster "ProjectX: Schneiden und demultiplexen" java -jar $pjx -tots -gui -split 4300 -ini $konfiguration/x.ini -out $tmp1 -name film "$quelldatei" } mpeg1_input () { fortschrittfenster "ffmpeg: Decodierung Audio" $ffmpeg -i "$quelldatei" $tmp1/film.mp2 -vcodec copy $tmp1/film.m1v } # °°°°°Bearbeitung°°°° requantisieren () { audio_video_summe=`du -bc $tmp1/*.ac3 $tmp1/*.mp2 $tmp1/*.m2v | cut -f1 | tail -n 1` if [ $audio_video_summe -ge $dvdgroesse ] then kdialog --yesno "Der Film ist zu groß für eine DVD. Requantisieren?" if [ $? = 0 ] then fortschrittfenster "Requantisieren" videogroesse=`du -bc $tmp1/*.m2v | cut -f1 | tail -n 1` audio_summe=`du -bc $tmp1/*.ac3 $hauptverzeichnis/tmp1/*.mp2 | cut -f1 | tail -n 1` requantisierungsfaktor=`echo "scale=8 ; ${videogroesse}/$((dvdgroesse-audio_summe))*1.04" | bc` cat $tmp1/film.m2v | requant_lxdvdrip $requantisierungsfaktor $videogroesse > $hauptverzeichnis/tmp1/film.requant mv $tmp1/film.requant $tmp1/film.m2v else programmende fi fi } # mp2-Ton auf einheitliche Lautstärke bringen (-12dBfs) normalisieren () { mv $tmp1/film.mp2 $tmp2 rm -- $tmp1/*.mp2 fortschrittfenster "ffmpeg: Ton decodieren" $ffmpeg -i $tmp2/film.mp2 $tmp2/film.mp2.wav fortschrittfenster "normalize: Ton normalisieren" $normalize $hauptverzeichnis/tmp2/film.mp2.wav fortschrittfenster "ffmpeg: Ton encodieren" $ffmpeg -i $tmp2/film.mp2.wav -acodec mp2 -ab 192k $tmp1/film.mp2 rm -- $tmp2/* } ac3_behalten () { if [ ! -e $tmp1/*.ac3 ] then fortschrittfenster "Der Clip enthält keinen AC3-Ton. Das Script wird nun beendet." programmende fi rm -- $tmp1/*.mp2 } mp2_behalten () { if [ ! -e $tmp1/*.mp2 ] then fortschrittfenster "Der Clip enthält keinen mp2-Ton. Das Script wird nun beendet." programmende fi rm -- $tmp1/*.ac3 } # °°°°Multiplexen, Codieren°°°° multiplexen () { fortschrittfenster "mplex: Multiplexen, kann etwas dauern ..." mpeg1_video= mpeg2_video= mp2_audio= ac3_audio= mpeg1_video=`find $tmp1 | grep "m1v"` mpeg2_video=`find $tmp1 | grep "m2v"` mp2_audio=`find $tmp1 | grep "mp2"` ac3_audio=`find $tmp1 | grep "ac3"` $mplex -v1 -f8 -o $tmp1/film.mpg $mpeg1_video $mpeg2_video $ac3_audio $mp2_audio if [ ! -e $tmp1/film.mpg ] then fortschrittfenster "Es konnte keine Datei multiplext werden!" programmende fi } # °°°°Authorn°°°° authoring_ohne_menue () { fortschrittfenster "dvdauthor: Erzeugen der DVD-Struktur" $dvdauthor -o $dvdstruktur -t $tmp1/film.mpg #VOBs und "Kapitel"-IFOs $dvdauthor -o $dvdstruktur -T #VIDEO_TS.BUP und VIDEO_TS.IFO } # °°°°Brennen°°°° # Video-DVD brennen_video_dvd () { fortschrittfenster "growisofs: Video-DVD brennen" $growisofs -dry-run -speed=$speed -dvd-compat -Z /dev/dvd -dvd-video $brenn_pfad while [ $? != 0 ] do kdialog --warningcontinuecancel "DVD nicht bereit" if [ $? != 0 ] then fortschrittfenster "Abbruch durch den Benutzer" programmende fi $growisofs -dry-run -speed=$speed -dvd-compat -Z /dev/dvd -dvd-video $brenn_pfad done fortschrittfenster "Brennen beginnt" $growisofs -speed=$speed -dvd-compat -Z /dev/dvd -dvd-video $brenn_pfad fortschrittfenster "Brennen fertig. Programm beendet" programmende } # Daten-DVD brennen_ts () { fortschrittfenster "growisofs: Daten-DVD brennen" dvdzahl=`find $brenn_pfad -type f | wc -l` fortschrittfenster "Anzahl der notwendigen DVDs: $dvdzahl" for((i=1; i<=$dvdzahl; i++)) do $growisofs -dry-run -speed=$speed -Z /dev/dvd -allow-limited-size -R -J $brenn_pfad/"film($((i-1)))[remux].ts" while [ $? != 0 ] do kdialog --warningcontinuecancel "Bitte DVD Nr.: $i einlegen" if [ $? != 0 ] then fortschrittfenster "Abbruch durch den Benutzer" programmende fi $growisofs -dry-run -speed=$speed -Z /dev/dvd -allow-limited-size -R -J $brenn_pfad/"film($((i-1)))[remux].ts" done fortschrittfenster "Brennvorgang gestartet" $growisofs -speed=$speed -Z /dev/dvd -allow-limited-size -R -J $brenn_pfad/"film($((i-1)))[remux].ts" done fortschrittfenster "Brennen fertig. Programm beendet" programmende } #°°°°Sichern°°°° sichern_dvd_struktur () { fortschrittfenster "Sichern der DVD-Stuktur" sicherungsordner="$(date +%Y%m%d%H%M%S)_dvd" mkdir $sicherung/$sicherungsordner mv $dvdstruktur/* $sicherung/$sicherungsordner fortschrittfenster "Datei gesichert nach $sicherung/$sicherungsordner. Programm beendet" programmende } sichern_ts () { fortschrittfenster "Sichern des TS-File" sicherungsordner="$(date +%Y%m%d%H%M%S)_ts" mkdir $sicherung/$sicherungsordner mv $tmp1/*.ts $sicherung/$sicherungsordner fortschrittfenster "Datei gesichert nach $sicherung/$sicherungsordner. Programm beendet" programmende } sichern_clip () { fortschrittfenster "Speichern des Videoclips" clipspeicher=`kdialog --title "$quelldatei" --getsavefilename $clip_verz` if [ $? != 0 ] then fortschrittfenster "Abbruch durch den Benutzer" programmende fi if [ -e "$clipspeicher" ] then kdialog --yesno "Dieser Clip ist schon gespeichert. Überschreiben?" if [ $? != 0 ] then sichern_clip fi fi mv $tmp1/film.mpg "$clipspeicher" fortschrittfenster "Videoclip gespeichert: $clipspeicher" programmende } # --------------------------------Hauptprogramm------------------------------------ fenster_leeren konfiguration arbeitsordner_leeren # Video-DVD case $was_tun in 11) filmauswahl pjx_demux_gui requantisieren multiplexen authoring_ohne_menue brennen_video_dvd programmende ;; 12) filmauswahl pjx_demux_gui requantisieren multiplexen authoring_ohne_menue sichern_dvd_struktur programmende ;; 13) verzeichnisauswahl brennen_video_dvd programmende ;; esac # Daten-DVD case $was_tun in 21) filmauswahl pjx_ts_gui brennen_ts programmende ;; 22) filmauswahl pjx_ts_gui sichern_ts programmende ;; 23) verzeichnisauswahl brennen_ts programmende ;; esac # Videoclips case $was_tun in 31) filmauswahl pjx_demux_gui multiplexen sichern_clip programmende ;; 32) filmauswahl pjx_demux_gui ac3_behalten multiplexen sichern_clip programmende ;; 33) filmauswahl pjx_demux_gui mp2_behalten multiplexen sichern_clip programmende ;; 34) filmauswahl mpeg1_input multiplexen sichern_clip programmende ;; 37) filmauswahl pjx_demux_gui mp2_behalten normalisieren multiplexen sichern_clip programmende ;; 38) filmauswahl mpeg1_input normalisieren multiplexen sichern_clip programmende ;; esac
Vom DVB zur DVD, die GUI: Anleitungen - Installation - GUI-Kommanderscript - Arbeitsscript - Dokumentation |