Dvb script gui/scriptcode: Unterschied zwischen den Versionen

Aus Linupedia.org
Wechseln zu: Navigation, Suche
(Arbeitsscript 0.4.0)
(Baustelle aufgemacht)
Zeile 1: Zeile 1:
 +
{{UnderConstruction}}
 
{{Box Test||
 
{{Box Test||
 
OpenSuse 11.0 (32Bit) mit KDE 3.9.x <br>
 
OpenSuse 11.0 (32Bit) mit KDE 3.9.x <br>

Version vom 21. November 2009, 19:33 Uhr

Höhe=24px
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
OpenSuse 11.0 (32Bit) mit KDE 4.1
OpenSuse 11.0 (32Bit) mit KDE 4.2


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


Zurück zur Multimedia-Übersicht