Dvb script gui/scriptcode: Unterschied zwischen den Versionen
Escho (Diskussion | Beiträge) (Navibox) |
Escho (Diskussion | Beiträge) (export VIDEO_FORMAT=PAL) |
||
| (20 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
| − | {{ | + | {{dvb_script_gui_testbox}} |
| − | |||
| − | |||
| − | }} | ||
{{dvb_script_gui_navibox}} | {{dvb_script_gui_navibox}} | ||
| Zeile 8: | Zeile 5: | ||
<pre> | <pre> | ||
#!/bin/bash | #!/bin/bash | ||
| − | |||
| − | |||
| − | |||
#Name: dvb_script_gui_arbeitsscript | #Name: dvb_script_gui_arbeitsscript | ||
| − | #Version: 0.0 | + | #Version: 0.5.0 |
| − | #Erstellungsdatum: | + | #Erstellungsdatum: 9.1.2011 |
#Autor: escho (www.linux-club.de) | #Autor: escho (www.linux-club.de) | ||
#Benutzung auf eigene Gefahr | #Benutzung auf eigene Gefahr | ||
#Dieses Shell Script automatisiert weitgehend die Vorgänge, die nötig sind, um aus einer DVB-Aufnahme | #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 | + | #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 | |
| − | + | ||
| − | + | export VIDEO_FORMAT=PAL | |
| + | |||
| + | # 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=$HOME/DVB/PJX/Project-X/ProjectX.jar #ProjectX - CVS - edgar | ||
| + | #pjx= ~/Project-X/ProjectX.jar # Projectx - CVS - Standard | ||
| − | + | # Verzeichnisse | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | # | + | #°°°°Hauptverzeichnis°°°° |
| − | + | hauptverzeichnis=$HOME/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=/daten/Videoclips/Clips |
| + | # Ü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 () | |
{ | { | ||
| − | + | 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 () | filmauswahl () | ||
{ | { | ||
| − | + | fortschrittfenster "Quelldatei auswählen" | |
| − | quelldatei=`kdialog --caption "Filmauswahl" --geometry 600x500-0+0 --getopenfilename | + | |
| + | 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 ] | if [ $? != 0 ] | ||
then | then | ||
| − | + | fortschrittfenster "Abbruch durch den Benutzer" | |
| + | programmende | ||
fi | fi | ||
} | } | ||
| − | + | verzeichnisauswahl () | |
{ | { | ||
| − | verzeichnistyp="*_dvd" | + | 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` | |
| − | verzeichnistyp | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
case $anzahl_der_sicherungen in | case $anzahl_der_sicherungen in | ||
| − | 0) | + | 0) fortschrittfenster "Es gibt nichts passendes zum Brennen. Das Script wird nun beendet." |
| − | 1) | + | programmende ;; |
| + | 1) fortschrittfenster "$hilfsverzeichnis" | ||
verzeichnis=$hilfsverzeichnis ;; | verzeichnis=$hilfsverzeichnis ;; | ||
*) verzeichnis=`kdialog --combobox "Welche Datei soll gebrannt werden?" $hilfsverzeichnis` | *) verzeichnis=`kdialog --combobox "Welche Datei soll gebrannt werden?" $hilfsverzeichnis` | ||
if [ $? != 0 ] | if [ $? != 0 ] | ||
then | then | ||
| − | + | fortschrittfenster "Abbruch durch den Benutzer" | |
| + | programmende | ||
fi ;; | fi ;; | ||
esac | esac | ||
| + | |||
brenn_pfad=$verzeichnis | brenn_pfad=$verzeichnis | ||
} | } | ||
| − | |||
| − | # | + | # °°°°Eingangsverarbeitung°°°° |
| + | |||
| + | # Schneiden und Demultiplexen | ||
pjx_demux_gui () | pjx_demux_gui () | ||
{ | { | ||
| − | + | fortschrittfenster "ProjectX: Schneiden und demultiplexen" | |
| − | java -jar $ | + | java -jar $pjx -demux -gui -ini $konfiguration/x.ini -out $tmp1 -name film "$quelldatei" |
} | } | ||
| − | # | + | # Schneiden und Wandeln nach TS |
pjx_ts_gui () | pjx_ts_gui () | ||
{ | { | ||
| − | + | fortschrittfenster "ProjectX: Schneiden und demultiplexen" | |
| − | java -jar $ | + | java -jar $pjx -tots -gui -split 4300 -ini $konfiguration/x.ini -out $tmp1 -name film "$quelldatei" |
} | } | ||
mpeg1_input () | mpeg1_input () | ||
{ | { | ||
| − | + | fortschrittfenster "ffmpeg: Decodierung Audio" | |
| − | $ | + | $ffmpeg -i "$quelldatei" $tmp1/film.mp2 -vcodec copy $tmp1/film.m1v |
} | } | ||
| − | # | + | # °°°°°Bearbeitung°°°° |
requantisieren () | requantisieren () | ||
{ | { | ||
| − | + | audio_video_summe=`du -bc $tmp1/*.ac3 $tmp1/*.mp2 $tmp1/*.m2v | cut -f1 | tail -n 1` | |
| − | + | if [ $audio_video_summe -ge $dvdgroesse ] | |
| − | audio_video_summe=`du -bc $ | ||
| − | |||
| − | |||
| − | if [ $audio_video_summe -ge $ | ||
then | then | ||
| − | + | fortschrittfenster "Der Film ist zu groß für eine DVD. Es wird requantisiert!" | |
| − | + | 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` | ||
| + | ${tcrequant} -d2 -i $tmp1/film.m2v -o $tmp1/film.requant -f $requantisierungsfaktor | ||
| + | mv $tmp1/film.requant $tmp1/film.m2v | ||
fi | fi | ||
} | } | ||
| − | # | + | # mp2-Ton auf einheitliche Lautstärke bringen (-12dBfs) |
normalisieren () | normalisieren () | ||
{ | { | ||
| − | mv $ | + | mv $tmp1/film.mp2 $tmp2 |
| − | rm $ | + | 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 $ | + | rm -- $tmp2/* |
} | } | ||
ac3_behalten () | ac3_behalten () | ||
{ | { | ||
| − | if [ ! -e $ | + | if [ ! -e $tmp1/*.ac3 ] |
then | then | ||
| − | + | fortschrittfenster "Der Clip enthält keinen AC3-Ton. Das Script wird nun beendet." | |
| + | programmende | ||
fi | fi | ||
| − | rm $ | + | rm -- $tmp1/*.mp2 |
} | } | ||
mp2_behalten () | mp2_behalten () | ||
{ | { | ||
| − | if [ ! -e $ | + | if [ ! -e $tmp1/*.mp2 ] |
then | then | ||
| − | + | fortschrittfenster "Der Clip enthält keinen mp2-Ton. Das Script wird nun beendet." | |
| + | programmende | ||
fi | fi | ||
| − | rm $ | + | rm -- $tmp1/*.ac3 |
} | } | ||
| − | # | + | # °°°°Multiplexen, Codieren°°°° |
multiplexen () | multiplexen () | ||
{ | { | ||
| − | + | fortschrittfenster "mplex: Multiplexen, kann etwas dauern ..." | |
mpeg1_video= | mpeg1_video= | ||
mpeg2_video= | mpeg2_video= | ||
| Zeile 290: | Zeile 291: | ||
ac3_audio= | ac3_audio= | ||
| − | mpeg1_video=`find $ | + | mpeg1_video=`find $tmp1 | grep "m1v"` |
| − | mpeg2_video=`find $ | + | mpeg2_video=`find $tmp1 | grep "m2v"` |
| − | mp2_audio=`find $ | + | mp2_audio=`find $tmp1 | grep "mp2"` |
| − | ac3_audio=`find $ | + | ac3_audio=`find $tmp1 | grep "ac3"` |
| − | $ | + | $mplex -v1 -f8 -o $tmp1/film.mpg $mpeg1_video $mpeg2_video $ac3_audio $mp2_audio |
| − | if [ ! -e $ | + | if [ ! -e $tmp1/film.mpg ] |
then | then | ||
| − | + | fortschrittfenster "Es konnte keine Datei multiplext werden!" | |
| + | programmende | ||
fi | fi | ||
} | } | ||
| − | # | + | # °°°°Authorn°°°° |
authoring_ohne_menue () | 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 () | 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" | kdialog --warningcontinuecancel "DVD nicht bereit" | ||
| − | if [ $? = 0 ] | + | if [ $? != 0 ] |
then | then | ||
| − | + | fortschrittfenster "Abbruch durch den Benutzer" | |
| − | + | programmende | |
| − | |||
fi | 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 () | brennen_ts () | ||
{ | { | ||
| − | + | fortschrittfenster "growisofs: Daten-DVD brennen" | |
| − | dvdzahl=`find $ | + | dvdzahl=`find $brenn_pfad -type f | wc -l` |
| − | + | fortschrittfenster "Anzahl der notwendigen DVDs: $dvdzahl" | |
| − | |||
| − | for((i=1; i<=$ | + | for((i=1; i<=$dvdzahl; i++)) |
do | 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 | done | ||
| − | + | fortschrittfenster "Brennen fertig. Programm beendet" | |
| + | programmende | ||
} | } | ||
| − | + | #°°°°Sichern°°°° | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | # | ||
sichern_dvd_struktur () | sichern_dvd_struktur () | ||
{ | { | ||
| − | + | fortschrittfenster "Sichern der DVD-Stuktur" | |
sicherungsordner="$(date +%Y%m%d%H%M%S)_dvd" | sicherungsordner="$(date +%Y%m%d%H%M%S)_dvd" | ||
| − | mkdir $ | + | mkdir $sicherung/$sicherungsordner |
| − | mv $ | + | mv $dvdstruktur/* $sicherung/$sicherungsordner |
| − | + | fortschrittfenster "Datei gesichert nach $sicherung/$sicherungsordner. Programm beendet" | |
| + | programmende | ||
} | } | ||
sichern_ts () | sichern_ts () | ||
{ | { | ||
| − | + | fortschrittfenster "Sichern des TS-File" | |
sicherungsordner="$(date +%Y%m%d%H%M%S)_ts" | sicherungsordner="$(date +%Y%m%d%H%M%S)_ts" | ||
| − | mkdir $ | + | mkdir $sicherung/$sicherungsordner |
| − | mv $ | + | mv $tmp1/*.ts $sicherung/$sicherungsordner |
| − | + | fortschrittfenster "Datei gesichert nach $sicherung/$sicherungsordner. Programm beendet" | |
| + | programmende | ||
} | } | ||
sichern_clip () | sichern_clip () | ||
{ | { | ||
| − | + | fortschrittfenster "Speichern des Videoclips" | |
| − | clipspeicher=`kdialog --title "$quelldatei" --getsavefilename $ | + | clipspeicher=`kdialog --title "$quelldatei" --getsavefilename $clip_verz` |
if [ $? != 0 ] | if [ $? != 0 ] | ||
then | then | ||
| − | + | fortschrittfenster "Abbruch durch den Benutzer" | |
| + | programmende | ||
fi | 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 | case $was_tun in | ||
| − | 11) | + | 11) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
requantisieren | requantisieren | ||
multiplexen | multiplexen | ||
authoring_ohne_menue | authoring_ohne_menue | ||
| − | |||
brennen_video_dvd | brennen_video_dvd | ||
programmende ;; | programmende ;; | ||
| − | 12) | + | 12) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
requantisieren | requantisieren | ||
| Zeile 462: | Zeile 436: | ||
programmende ;; | programmende ;; | ||
| − | 13) | + | 13) verzeichnisauswahl |
| − | |||
brennen_video_dvd | brennen_video_dvd | ||
programmende ;; | programmende ;; | ||
esac | esac | ||
| − | #- | + | # Daten-DVD |
case $was_tun in | case $was_tun in | ||
| − | 21) | + | 21) filmauswahl |
pjx_ts_gui | pjx_ts_gui | ||
brennen_ts | brennen_ts | ||
programmende ;; | programmende ;; | ||
| − | 22) | + | 22) filmauswahl |
pjx_ts_gui | pjx_ts_gui | ||
sichern_ts | sichern_ts | ||
programmende ;; | programmende ;; | ||
| − | 23) | + | 23) verzeichnisauswahl |
brennen_ts | brennen_ts | ||
programmende ;; | programmende ;; | ||
esac | esac | ||
| − | # | + | # Videoclips |
case $was_tun in | case $was_tun in | ||
| − | 31) | + | 31) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
multiplexen | multiplexen | ||
| Zeile 497: | Zeile 470: | ||
programmende ;; | programmende ;; | ||
| − | 32) | + | 32) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
ac3_behalten | ac3_behalten | ||
| Zeile 504: | Zeile 477: | ||
programmende ;; | programmende ;; | ||
| − | 33) | + | 33) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
mp2_behalten | mp2_behalten | ||
| Zeile 517: | Zeile 490: | ||
programmende ;; | programmende ;; | ||
| − | 37) | + | 37) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
mp2_behalten | mp2_behalten | ||
| Zeile 531: | Zeile 504: | ||
sichern_clip | sichern_clip | ||
programmende ;; | programmende ;; | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
esac | esac | ||
| − | |||
</pre> | </pre> | ||
{{dvb_script_gui_navibox}} | {{dvb_script_gui_navibox}} | ||
[[Multimedia|Zurück zur Multimedia-Übersicht]] | [[Multimedia|Zurück zur Multimedia-Übersicht]] | ||
| − | [[Category: | + | [[Category:DVB-Weiterverarbeitung]] |
Aktuelle Version vom 9. Januar 2011, 14:45 Uhr
| Diese Beschreibung wurde mit folgenden Distributionen getestet: |
|
OpenSuse 11.0 (32Bit) mit KDE 3.9.x / 4.1 / 4.2 |
| Vom DVB zur DVD, die GUI: Anleitungen - Installation - GUI-Kommanderscript - Arbeitsscript - Dokumentation |
#!/bin/bash
#Name: dvb_script_gui_arbeitsscript
#Version: 0.5.0
#Erstellungsdatum: 9.1.2011
#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
export VIDEO_FORMAT=PAL
# 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=$HOME/DVB/PJX/Project-X/ProjectX.jar #ProjectX - CVS - edgar
#pjx= ~/Project-X/ProjectX.jar # Projectx - CVS - Standard
# Verzeichnisse
#°°°°Hauptverzeichnis°°°°
hauptverzeichnis=$HOME/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=/daten/Videoclips/Clips
# Ü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 ()
{
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
fortschrittfenster "Der Film ist zu groß für eine DVD. Es wird requantisiert!"
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`
${tcrequant} -d2 -i $tmp1/film.m2v -o $tmp1/film.requant -f $requantisierungsfaktor
mv $tmp1/film.requant $tmp1/film.m2v
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 |