Dvb script gui/scriptcode: Unterschied zwischen den Versionen

Aus Linupedia.org
Wechseln zu: Navigation, Suche
(tcrequant aus der Suchoutine entfernt, da das Tool nicht mehr in transcode enthalten ist)
(export VIDEO_FORMAT=PAL)
 
(9 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Box Test||
+
{{dvb_script_gui_testbox}}
OpenSuse 11.0 (32Bit) mit KDE 3.9.x <br>
 
OpenSuse 11.0 (32Bit) mit KDE 4.1
 
}}
 
  
 
{{dvb_script_gui_navibox}}
 
{{dvb_script_gui_navibox}}
Zeile 10: Zeile 7:
  
 
#Name: dvb_script_gui_arbeitsscript
 
#Name: dvb_script_gui_arbeitsscript
#Version: 0.2.2
+
#Version: 0.5.0
#Erstellungsdatum: 26.1.2009
+
#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
 
 
#Neu in dieser Version:
 
#tcrequant aus der Suchoutine entfernt, da das Tool nicht mehr in transcode enthalten ist
 
 
 
  
 
# ---------------------------------Vorbereitungen-------------------------------------
 
# ---------------------------------Vorbereitungen-------------------------------------
Zeile 30: Zeile 23:
 
# Voreinstellungen
 
# Voreinstellungen
  
hauptverzeichnis=~/dvbscript
+
speed=8 #maximale Brenngeschwindigkeit
ini_verz=~/.dvbscript
+
dvdgroesse=4600000000 #festgelegte Grösse der DVD in Byte
  
aufnahme=~/DVB/Aufnahme
+
export VIDEO_FORMAT=PAL
druckschablonen=~/DVB/Druckschablonen
 
videoclips=~/DVB/Videoclips
 
  
speed=8
+
# Die Hilfsprogramme
  
# Verzeichnisstruktur erstellen
+
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
  
mkdir $hauptverzeichnis 2>/dev/null
+
# Verzeichnisse
mkdir $ini_verz 2>/dev/null
 
  
mkdir $hauptverzeichnis/dvdstruktur 2>/dev/null
+
#°°°°Hauptverzeichnis°°°°
mkdir $hauptverzeichnis/screenshots 2>/dev/null
 
mkdir $hauptverzeichnis/sicherung 2>/dev/null
 
mkdir $hauptverzeichnis/tmp1 2>/dev/null
 
mkdir $hauptverzeichnis/tmp2 2>/dev/null
 
  
# Pfade für Kommmander
+
hauptverzeichnis=$HOME/DVB_Script #Hauptverzeichnis
  
echo $hauptverzeichnis > $ini_verz/hauptverzeichnis
+
# °°°°Arbeitsverzeichnisse°°°°
echo $hauptverzeichnis/fenster_fortschritt > $ini_verz/fortschrittfenster
 
echo $hauptverzeichnis/fenster_debug > $ini_verz/debugfenster
 
  
# Anzeigefenster leeren
+
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
  
echo "" > $hauptverzeichnis/fenster_fortschritt
+
# °°°°Verzeichnis für die Videoclips°°°°
echo "" > $hauptverzeichnis/fenster_debug
 
  
# Umleitung für Debug-Fenster
+
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
  
exec 2> $hauptverzeichnis/fenster_debug
+
# Anlegen der Verzeichnisstruktur
  
# Hilfsprogramme festlegen
+
if [ ! -e "$hauptverzeichnis" ]
 +
then
 +
    mkdir $hauptverzeichnis
 +
    mkdir $dvdstruktur
 +
    mkdir $sicherung
 +
    mkdir $tmp1
 +
    mkdir $tmp2
 +
    mkdir $kommander
 +
    mkdir $konfiguration
 +
fi
  
hilfsprogramm=( mplex dvdauthor ProjectX.jar normalize ffmpeg growisofs )
+
if [ ! -e "$clip_verz" ]
 +
then
 +
    mkdir $clip_verz
 +
fi
  
for var in ${hilfsprogramm[*]}
+
# Zugriffsdateien für das Debug- und das Fortschrittfenster anlegen (zur Anzeige in der GUI)
do
+
 
touch $ini_verz/$var
+
touch $kommander/debug
hilfsvar=`cat $ini_verz/$var`
+
touch $kommander/fortschritt
if [ ! -e "$hilfsvar/$var" ]
+
 
then
+
# Fehlermeldungen ins Debug-Fenster umleiten
echo "Programmsuche: $var" >> $hauptverzeichnis/fenster_fortschritt
 
gefundene_pfade=`find /bin $HOME /opt /usr ! -path "$HOME/.*" -type f -name $var ! -printf "%h " 2>/dev/null`
 
pfadzahl=`echo "$gefundene_pfade" | wc -w`
 
case "$pfadzahl" in
 
  
0) kdialog --error "Das Programm wurde nicht gefunden. Bitte zuerst installieren."
+
exec 2> $hauptverzeichnis/kommander/debug
exit ;;
 
  
1) echo "$var gefunden" >> $hauptverzeichnis/fenster_fortschritt
+
# ----------------------------------Funktionen-------------------------------------
echo $gefundene_pfade > $ini_verz/$var ;;
 
  
*) auswahl=`kdialog --caption "$var" --combobox "Bitte Pfad auswählen" $gefundene_pfade`
+
# °°°°Meldungen°°°°
if [ $? = 0 ]
+
 
then
+
fortschrittfenster ()
echo "$var gefunden" >> $hauptverzeichnis/fenster_fortschritt
+
{
echo $auswahl > $ini_verz/$var
+
echo "$1" >> $kommander/fortschritt
else
+
}
kdialog --error "Abbruch durch den Benutzer! Installation wird abgebrochen!"
 
exit
 
fi ;;
 
esac
 
fi
 
done
 
  
# Hilfsprogramme laden
+
fenster_leeren ()
 +
{
 +
echo "" > $kommander/fortschritt
 +
echo "" > $kommander/debug
 +
}
 +
# °°°° Programmende °°°°
  
mplex=`cat $ini_verz/mplex`/mplex
+
programmende ()
dvdauthor=`cat $ini_verz/dvdauthor`/dvdauthor
+
{
pjx=`cat $ini_verz/ProjectX.jar`/ProjectX.jar
+
kdialog --yesno "Programm beendet. Fensterinhalte löschen?"
normalize=`cat $ini_verz/normalize`/normalize
+
if [ $? = 0 ]
ffmpeg=`cat $ini_verz/ffmpeg`/ffmpeg
+
then
growisofs=`cat $ini_verz/growisofs`/growisofs
+
fenster_leeren
 +
fi
 +
exit
 +
}
  
# X.ini erzeugen
+
# °°°°Konfiguration°°°°
  
 +
konfiguration ()
 +
{
 
echo "X.ini für ProjectX erzeugen"
 
echo "X.ini für ProjectX erzeugen"
 
echo \
 
echo \
Zeile 115: Zeile 132:
 
Application.Agreement=1
 
Application.Agreement=1
 
Application.Language=de
 
Application.Language=de
Application.ActiveDirectory=$hauptverzeichnis/screenshots
 
  
 
# CollectionPanel
 
# CollectionPanel
Zeile 127: Zeile 143:
 
OptionPanel.NormalLog=0
 
OptionPanel.NormalLog=0
 
OptionPanel.closeOnEnd=1" \
 
OptionPanel.closeOnEnd=1" \
> $hauptverzeichnis/X.ini
+
> $konfiguration/x.ini
 
 
# Playlist für mplayer
 
 
 
find $videoclips/* > ~/.mplayer/playlist
 
 
 
# Löschen
 
 
 
echo "Löschen tmp, kann etwas dauern ..." > $hauptverzeichnis/fenster_fortschritt
 
rm -r -- $hauptverzeichnis/tmp1/* 2>/dev/null
 
rm -r -- $hauptverzeichnis/tmp2/* 2>/dev/null
 
rm -r -- $hauptverzeichnis/dvdstruktur/* 2>/dev/null
 
 
 
# ----------------------------------Funktionen-------------------------------------
 
 
 
# °°°° Abbruch °°°°
 
 
 
benutzerabbruch ()
 
{
 
echo "Abbruch durch den Benutzer" >> $hauptverzeichnis/fenster_fortschritt
 
programmende
 
}
 
 
 
funktionsabbruch ()
 
{
 
echo "$1" >> $hauptverzeichnis/fenster_fortschritt
 
programmende
 
 
}
 
}
  
programmende ()
+
arbeitsordner_leeren ()
 
{
 
{
echo "Ende" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "Löschen tmp, kann etwas dauern ..."
kdialog --passivepopup "Programmende" 1000
+
rm -r -- $tmp1/* 2>/dev/null
echo "" > $hauptverzeichnis/fenster_fortschritt
+
rm -r -- $tmp2/* 2>/dev/null
exit
+
rm -r -- $dvdstruktur/* 2>/dev/null
 
}
 
}
  
Zeile 168: Zeile 158:
 
filmauswahl ()
 
filmauswahl ()
 
{
 
{
echo "Quelldatei auswählen" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "Quelldatei auswählen"
  
 
case $was_tun in
 
case $was_tun in
11) brenn_pfad=$hauptverzeichnis/dvdstruktur ;;
+
11) brenn_pfad=$dvdstruktur ;;
12) brenn_pfad=$hauptverzeichnis/dvdstruktur ;;
+
12) brenn_pfad=$dvdstruktur ;;
21) brenn_pfad=$hauptverzeichnis/tmp1 ;;
+
21) brenn_pfad=$tmp1 ;;
22) brenn_pfad=$hauptverzeichnis/tmp1 ;;
+
22) brenn_pfad=$tmp1 ;;
 
esac
 
esac
  
quelldatei=`kdialog --caption "Filmauswahl" --geometry 600x500-0+0 --getopenfilename "$aufnahme"`
+
quelldatei=`kdialog --caption "Filmauswahl" --geometry 600x500-0+0 --getopenfilename ~`
 
if [ $? != 0 ]
 
if [ $? != 0 ]
 
then
 
then
benutzerabbruch
+
fortschrittfenster "Abbruch durch den Benutzer"
 +
programmende
 
fi
 
fi
 
}
 
}
Zeile 186: Zeile 177:
 
verzeichnisauswahl ()
 
verzeichnisauswahl ()
 
{
 
{
echo "Quelldatei auswählen" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "Quelldatei auswählen"
  
 
case $was_tun in
 
case $was_tun in
Zeile 193: Zeile 184:
 
esac
 
esac
  
anzahl_der_sicherungen=`find $hauptverzeichnis/sicherung/$verzeichnistyp -maxdepth 0 -type d | wc -l`
+
anzahl_der_sicherungen=`find $sicherung/$verzeichnistyp -maxdepth 0 -type d | wc -l`
hilfsverzeichnis=`find $hauptverzeichnis/sicherung/$verzeichnistyp -maxdepth 0 -type d`
+
hilfsverzeichnis=`find $sicherung/$verzeichnistyp -maxdepth 0 -type d`
  
 
case $anzahl_der_sicherungen in
 
case $anzahl_der_sicherungen in
0) funktionsabbruch "Es gibt nichts passendes zum Brennen. Das Script wird nun beendet." ;;
+
0) fortschrittfenster "Es gibt nichts passendes zum Brennen. Das Script wird nun beendet."
1) echo "$hilfsverzeichnis" >> $hauptverzeichnis/fenster_fortschritt
+
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
benutzerabbruch
+
fortschrittfenster "Abbruch durch den Benutzer"
 +
programmende
 
fi ;;
 
fi ;;
 
esac
 
esac
Zeile 215: Zeile 208:
 
pjx_demux_gui ()
 
pjx_demux_gui ()
 
{
 
{
echo "ProjectX: Schneiden und demultiplexen" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "ProjectX: Schneiden und demultiplexen"
java -jar $pjx -demux -gui -ini $hauptverzeichnis/X.ini -out $hauptverzeichnis/tmp1 -name film "$quelldatei"
+
java -jar $pjx -demux -gui -ini $konfiguration/x.ini -out $tmp1 -name film "$quelldatei"
audio_video_summe=`du -bc $hauptverzeichnis/tmp1/*.ac3 $hauptverzeichnis/tmp1/*.mp2 $hauptverzeichnis/tmp1/*.m2v | cut -f1 | tail -n 1`
 
if [ $audio_video_summe -ge $dvdgroesse ]
 
then
 
kdialog --error "Das Bearbeitungsergebnis wird zu groß für eine DVD"
 
programmende
 
fi
 
 
}
 
}
  
Zeile 228: Zeile 215:
 
pjx_ts_gui ()
 
pjx_ts_gui ()
 
{
 
{
echo "ProjectX: Schneiden und demultiplexen" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "ProjectX: Schneiden und demultiplexen"
java -jar $pjx -tots -gui -split 4300 -ini $hauptverzeichnis/X.ini -out $hauptverzeichnis/tmp1 -name film "$quelldatei"
+
java -jar $pjx -tots -gui -split 4300 -ini $konfiguration/x.ini -out $tmp1 -name film "$quelldatei"
 
}
 
}
  
 
mpeg1_input ()
 
mpeg1_input ()
 
{
 
{
echo "ffmpeg: Decodierung Audio" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "ffmpeg: Decodierung Audio"
$ffmpeg -i "$quelldatei" $hauptverzeichnis/tmp1/film.mp2 -vcodec copy $hauptverzeichnis/tmp1/film.m1v
+
$ffmpeg -i "$quelldatei" $tmp1/film.mp2 -vcodec copy $tmp1/film.m1v
 
}
 
}
  
 
# °°°°°Bearbeitung°°°°
 
# °°°°°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)
 
# mp2-Ton auf einheitliche Lautstärke bringen (-12dBfs)
 
normalisieren ()
 
normalisieren ()
 
{
 
{
mv $hauptverzeichnis/tmp1/film.mp2 $hauptverzeichnis/tmp2
+
mv $tmp1/film.mp2 $tmp2
rm -- $hauptverzeichnis/tmp1/*.mp2
+
rm -- $tmp1/*.mp2
  
echo "ffmpeg: Ton decodieren" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "ffmpeg: Ton decodieren"
$ffmpeg -i $hauptverzeichnis/tmp2/film.mp2 $hauptverzeichnis/tmp2/film.mp2.wav
+
$ffmpeg -i $tmp2/film.mp2 $tmp2/film.mp2.wav
  
echo "normalize: Ton normalisieren" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "normalize: Ton normalisieren"
 
$normalize $hauptverzeichnis/tmp2/film.mp2.wav
 
$normalize $hauptverzeichnis/tmp2/film.mp2.wav
  
echo "ffmpeg: Ton encodieren" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "ffmpeg: Ton encodieren"
$ffmpeg -i $hauptverzeichnis/tmp2/film.mp2.wav -acodec mp2 -ab 192k $hauptverzeichnis/tmp1/film.mp2
+
$ffmpeg -i $tmp2/film.mp2.wav -acodec mp2 -ab 192k $tmp1/film.mp2
  
rm -- $hauptverzeichnis/tmp2/*
+
rm -- $tmp2/*
 
}
 
}
  
 
ac3_behalten ()
 
ac3_behalten ()
 
{
 
{
if [ ! -e $hauptverzeichnis/tmp1/*.ac3 ]
+
if [ ! -e $tmp1/*.ac3 ]
 
then
 
then
funktionsabbruch "Der Clip enthält keinen AC3-Ton. Das Script wird nun beendet."
+
fortschrittfenster "Der Clip enthält keinen AC3-Ton. Das Script wird nun beendet."
 +
programmende
 
fi
 
fi
  
rm -- $hauptverzeichnis/tmp1/*.mp2
+
rm -- $tmp1/*.mp2
 
}
 
}
  
 
mp2_behalten ()
 
mp2_behalten ()
 
{
 
{
if [ ! -e $hauptverzeichnis/tmp1/*.mp2 ]
+
if [ ! -e $tmp1/*.mp2 ]
 
then
 
then
funktionsabbruch "Der Clip enthält keinen mp2-Ton. Das Script wird nun beendet."
+
fortschrittfenster "Der Clip enthält keinen mp2-Ton. Das Script wird nun beendet."
 +
programmende
 
fi
 
fi
  
rm -- $hauptverzeichnis/tmp1/*.ac3
+
rm -- $tmp1/*.ac3
 
}
 
}
  
Zeile 282: Zeile 285:
 
multiplexen ()
 
multiplexen ()
 
{
 
{
echo "mplex: Multiplexen, kann etwas dauern ..." >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "mplex: Multiplexen, kann etwas dauern ..."
 
mpeg1_video=
 
mpeg1_video=
 
mpeg2_video=
 
mpeg2_video=
Zeile 288: Zeile 291:
 
ac3_audio=
 
ac3_audio=
  
mpeg1_video=`find $hauptverzeichnis/tmp1 | grep "m1v"`
+
mpeg1_video=`find $tmp1 | grep "m1v"`
mpeg2_video=`find $hauptverzeichnis/tmp1 | grep "m2v"`
+
mpeg2_video=`find $tmp1 | grep "m2v"`
mp2_audio=`find $hauptverzeichnis/tmp1 | grep "mp2"`
+
mp2_audio=`find $tmp1 | grep "mp2"`
ac3_audio=`find $hauptverzeichnis/tmp1 | grep "ac3"`
+
ac3_audio=`find $tmp1 | grep "ac3"`
  
$mplex -v1 -f8 -o $hauptverzeichnis/tmp1/film.mpg $mpeg1_video $mpeg2_video $ac3_audio $mp2_audio
+
$mplex -v1 -f8 -o $tmp1/film.mpg $mpeg1_video $mpeg2_video $ac3_audio $mp2_audio
  
if [ ! -e $hauptverzeichnis/tmp1/film.mpg ]
+
if [ ! -e $tmp1/film.mpg ]
 
then
 
then
funktionsabbruch "Es konnte keine Datei multiplext werden!"
+
fortschrittfenster "Es konnte keine Datei multiplext werden!"
 +
programmende
 
fi
 
fi
 
}
 
}
Zeile 305: Zeile 309:
 
authoring_ohne_menue ()
 
authoring_ohne_menue ()
 
{
 
{
echo "dvdauthor: Erzeugen der DVD-Struktur" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "dvdauthor: Erzeugen der DVD-Struktur"
$dvdauthor -o $hauptverzeichnis/dvdstruktur -t $hauptverzeichnis/tmp1/film.mpg  #VOBs und "Kapitel"-IFOs
+
$dvdauthor -o $dvdstruktur -t $tmp1/film.mpg  #VOBs und "Kapitel"-IFOs
$dvdauthor -o $hauptverzeichnis/dvdstruktur -T #VIDEO_TS.BUP und VIDEO_TS.IFO
+
$dvdauthor -o $dvdstruktur -T #VIDEO_TS.BUP und VIDEO_TS.IFO
 
}
 
}
  
Zeile 315: Zeile 319:
 
brennen_video_dvd ()
 
brennen_video_dvd ()
 
{
 
{
echo "growisofs: Video-DVD brennen" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "growisofs: Video-DVD brennen"
 
$growisofs  -dry-run -speed=$speed -dvd-compat -Z /dev/dvd -dvd-video $brenn_pfad
 
$growisofs  -dry-run -speed=$speed -dvd-compat -Z /dev/dvd -dvd-video $brenn_pfad
 
while [ $? != 0 ]
 
while [ $? != 0 ]
Zeile 322: Zeile 326:
 
if [ $? != 0 ]
 
if [ $? != 0 ]
 
then
 
then
benutzerabbruch
+
fortschrittfenster "Abbruch durch den Benutzer"
 +
programmende
 
fi
 
fi
 
$growisofs  -dry-run -speed=$speed -dvd-compat -Z /dev/dvd -dvd-video $brenn_pfad
 
$growisofs  -dry-run -speed=$speed -dvd-compat -Z /dev/dvd -dvd-video $brenn_pfad
 
done
 
done
echo "Brennen beginnt" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "Brennen beginnt"
 
$growisofs -speed=$speed -dvd-compat -Z /dev/dvd -dvd-video $brenn_pfad
 
$growisofs -speed=$speed -dvd-compat -Z /dev/dvd -dvd-video $brenn_pfad
funktionsabbruch "Brennen fertig. Programm beendet"
+
fortschrittfenster "Brennen fertig. Programm beendet"
 +
programmende
 
}
 
}
  
Zeile 334: Zeile 340:
 
brennen_ts ()
 
brennen_ts ()
 
{
 
{
echo "growisofs: Daten-DVD brennen" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "growisofs: Daten-DVD brennen"
 
dvdzahl=`find $brenn_pfad -type f | wc -l`
 
dvdzahl=`find $brenn_pfad -type f | wc -l`
echo "Anzahl der notwendigen DVDs: $dvdzahl" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "Anzahl der notwendigen DVDs: $dvdzahl"
  
 
for((i=1; i<=$dvdzahl; i++))
 
for((i=1; i<=$dvdzahl; i++))
Zeile 346: Zeile 352:
 
if [ $? != 0 ]
 
if [ $? != 0 ]
 
then
 
then
benutzerabbruch
+
fortschrittfenster "Abbruch durch den Benutzer"
 +
programmende
 
fi
 
fi
 
$growisofs -dry-run -speed=$speed -Z /dev/dvd -allow-limited-size -R -J $brenn_pfad/"film($((i-1)))[remux].ts"
 
$growisofs -dry-run -speed=$speed -Z /dev/dvd -allow-limited-size -R -J $brenn_pfad/"film($((i-1)))[remux].ts"
 
done
 
done
echo "Brennvorgang gestartet" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "Brennvorgang gestartet"
 
$growisofs -speed=$speed -Z /dev/dvd -allow-limited-size -R -J $brenn_pfad/"film($((i-1)))[remux].ts"
 
$growisofs -speed=$speed -Z /dev/dvd -allow-limited-size -R -J $brenn_pfad/"film($((i-1)))[remux].ts"
 
done
 
done
funktionsabbruch "Brennen fertig. Programm beendet"
+
fortschrittfenster "Brennen fertig. Programm beendet"
 +
programmende
 
}
 
}
  
Zeile 360: Zeile 368:
 
sichern_dvd_struktur ()
 
sichern_dvd_struktur ()
 
{
 
{
echo "Sichern der DVD-Stuktur" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "Sichern der DVD-Stuktur"
 
sicherungsordner="$(date +%Y%m%d%H%M%S)_dvd"
 
sicherungsordner="$(date +%Y%m%d%H%M%S)_dvd"
mkdir $hauptverzeichnis/sicherung/$sicherungsordner
+
mkdir $sicherung/$sicherungsordner
mv $hauptverzeichnis/dvdstruktur/* $hauptverzeichnis/sicherung/$sicherungsordner
+
mv $dvdstruktur/* $sicherung/$sicherungsordner
funktionsabbruch "Datei gesichert nach $hauptverzeichnis/sicherung/$sicherungsordner. Programm beendet"
+
fortschrittfenster "Datei gesichert nach $sicherung/$sicherungsordner. Programm beendet"
 +
programmende
 
}
 
}
  
 
sichern_ts ()
 
sichern_ts ()
 
{
 
{
echo "Sichern des TS-File" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "Sichern des TS-File"
 
sicherungsordner="$(date +%Y%m%d%H%M%S)_ts"
 
sicherungsordner="$(date +%Y%m%d%H%M%S)_ts"
mkdir $hauptverzeichnis/sicherung/$sicherungsordner
+
mkdir $sicherung/$sicherungsordner
mv $hauptverzeichnis/tmp1/*.ts $hauptverzeichnis/sicherung/$sicherungsordner
+
mv $tmp1/*.ts $sicherung/$sicherungsordner
funktionsabbruch "Datei gesichert nach $hauptverzeichnis/sicherung/$sicherungsordner. Programm beendet"
+
fortschrittfenster "Datei gesichert nach $sicherung/$sicherungsordner. Programm beendet"
 +
programmende
 
}
 
}
  
 
sichern_clip ()
 
sichern_clip ()
 
{
 
{
echo "Speichern des Videoclips" >> $hauptverzeichnis/fenster_fortschritt
+
fortschrittfenster "Speichern des Videoclips"
clipspeicher=`kdialog --title "$quelldatei" --getsavefilename $videoclips`
+
clipspeicher=`kdialog --title "$quelldatei" --getsavefilename $clip_verz`
 
if [ $? != 0 ]
 
if [ $? != 0 ]
 
then
 
then
benutzerabbruch
+
fortschrittfenster "Abbruch durch den Benutzer"
 +
programmende
 
fi
 
fi
  
Zeile 394: Zeile 405:
 
fi
 
fi
  
mv $hauptverzeichnis/tmp1/film.mpg "$clipspeicher"
+
mv $tmp1/film.mpg "$clipspeicher"
funktionsabbruch "Videoclip gespeichert: $clipspeicher"
+
fortschrittfenster "Videoclip gespeichert: $clipspeicher"
 +
programmende
 
}
 
}
  
 
# --------------------------------Hauptprogramm------------------------------------
 
# --------------------------------Hauptprogramm------------------------------------
 +
 +
fenster_leeren
 +
konfiguration
 +
arbeitsordner_leeren
  
 
# Video-DVD
 
# Video-DVD
Zeile 406: Zeile 422:
 
11) filmauswahl
 
11) filmauswahl
 
pjx_demux_gui
 
pjx_demux_gui
 +
requantisieren
 
multiplexen
 
multiplexen
 
authoring_ohne_menue
 
authoring_ohne_menue
Zeile 413: Zeile 430:
 
12) filmauswahl
 
12) filmauswahl
 
pjx_demux_gui
 
pjx_demux_gui
 +
requantisieren
 
multiplexen
 
multiplexen
 
authoring_ohne_menue
 
authoring_ohne_menue
Zeile 487: Zeile 505:
 
programmende ;;
 
programmende ;;
 
esac
 
esac
 
# DVD bedrucken
 
 
case $was_tun in
 
 
81) oodraw -o $druckschablonen/videodvd.odg
 
echo "" > $hauptverzeichnis/fenster_fortschritt ;;
 
 
82) oodraw -o $druckschablonen/datendvd.odg
 
echo "" > $hauptverzeichnis/fenster_fortschritt ;;
 
esac
 
 
 
 
</pre>
 
</pre>
  

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
OpenSuse 11.1 (32Bit) mit KDE 4.3
OpenSuse 11.2 (32Bit) mit KDE 4.3 / 4.4
OpenSuse 11.3 (32Bit) mit KDE 4.5


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


Zurück zur Multimedia-Übersicht