Dvb script gui/scriptcode: Unterschied zwischen den Versionen
Escho (Diskussion | Beiträge) (Neuanlage) |
Escho (Diskussion | Beiträge) (export VIDEO_FORMAT=PAL) |
||
(24 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
+ | {{dvb_script_gui_testbox}} | ||
+ | |||
{{dvb_script_gui_navibox}} | {{dvb_script_gui_navibox}} | ||
− | |||
<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 ) | |
− | { | + | |
− | if [ ! - | + | 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 | then | ||
− | + | mkdir $hauptverzeichnis | |
− | + | mkdir $dvdstruktur | |
+ | mkdir $sicherung | ||
+ | mkdir $tmp1 | ||
+ | mkdir $tmp2 | ||
+ | mkdir $kommander | ||
+ | mkdir $konfiguration | ||
fi | 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 () | programmende () | ||
{ | { | ||
− | + | kdialog --yesno "Programm beendet. Fensterinhalte löschen?" | |
− | + | if [ $? = 0 ] | |
− | kdialog -- | + | then |
− | + | fenster_leeren | |
+ | fi | ||
exit | 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 ;; | |
− | brenn_pfad=$ | + | 12) brenn_pfad=$dvdstruktur ;; |
− | + | 21) brenn_pfad=$tmp1 ;; | |
− | + | 22) brenn_pfad=$tmp1 ;; | |
− | + | esac | |
− | |||
− | |||
− | |||
− | |||
− | + | quelldatei=`kdialog --caption "Filmauswahl" --geometry 600x500-0+0 --getopenfilename ~` | |
− | |||
− | |||
− | 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 268: | 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 | |
− | + | programmende ;; | |
− | 12) | + | 12) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
requantisieren | requantisieren | ||
multiplexen | multiplexen | ||
authoring_ohne_menue | authoring_ohne_menue | ||
− | sichern_dvd_struktur ;; | + | sichern_dvd_struktur |
+ | programmende ;; | ||
− | 13) | + | 13) verzeichnisauswahl |
− | + | brennen_video_dvd | |
− | + | 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 ;; | ||
− | 22) | + | 22) filmauswahl |
pjx_ts_gui | pjx_ts_gui | ||
− | sichern_ts ;; | + | sichern_ts |
+ | programmende ;; | ||
− | 23) | + | 23) verzeichnisauswahl |
− | brennen_ts ;; | + | brennen_ts |
+ | programmende ;; | ||
esac | esac | ||
− | # | + | # Videoclips |
case $was_tun in | case $was_tun in | ||
− | 31) | + | 31) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
multiplexen | multiplexen | ||
− | sichern_clip ;; | + | sichern_clip |
+ | programmende ;; | ||
− | 32) | + | 32) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
ac3_behalten | ac3_behalten | ||
multiplexen | multiplexen | ||
− | sichern_clip ;; | + | sichern_clip |
+ | programmende ;; | ||
− | 33) | + | 33) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
mp2_behalten | mp2_behalten | ||
multiplexen | multiplexen | ||
− | sichern_clip ;; | + | sichern_clip |
+ | programmende ;; | ||
34) filmauswahl | 34) filmauswahl | ||
mpeg1_input | mpeg1_input | ||
multiplexen | multiplexen | ||
− | sichern_clip ;; | + | sichern_clip |
+ | programmende ;; | ||
− | 37) | + | 37) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
mp2_behalten | mp2_behalten | ||
normalisieren | normalisieren | ||
multiplexen | multiplexen | ||
− | sichern_clip ;; | + | sichern_clip |
+ | programmende ;; | ||
38) filmauswahl | 38) filmauswahl | ||
Zeile 496: | Zeile 502: | ||
normalisieren | normalisieren | ||
multiplexen | multiplexen | ||
− | sichern_clip ;; | + | sichern_clip |
− | + | programmende ;; | |
esac | esac | ||
+ | </pre> | ||
− | + | {{dvb_script_gui_navibox}} | |
− | + | [[Multimedia|Zurück zur Multimedia-Übersicht]] | |
− | + | [[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 |