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