Dvb script gui/scriptcode: Unterschied zwischen den Versionen

Aus Linupedia.org
Wechseln zu: Navigation, Suche
(Neue Script-Version (Änderungen siehe Scriptkopf))
K (neue Kategorie)
Zeile 564: Zeile 564:
 
[[Multimedia|Zurück zur Multimedia-Übersicht]]
 
[[Multimedia|Zurück zur Multimedia-Übersicht]]
 
[[Category:Multimedia]]
 
[[Category:Multimedia]]
 +
[[Category:DVB-Weiterverarbeitung]]

Version vom 16. Dezember 2008, 21:35 Uhr

Diese Beschreibung wurde mit folgenden Distributionen getestet:

OpenSuse 11.0 (32Bit) mit KDE 3.9.x
OpenSuse 11.0 (32Bit) mit KDE 4.1


Vom DVB zur DVD, die GUI: Anleitungen - Installation - GUI-Kommanderscript - Arbeitsscript - Dokumentation



#!/bin/bash
#was_tun=`echo @Self.item(0)`
was_tun=$1
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++BESCHREIBUNG ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#Name: dvb_script_gui_arbeitsscript
#Version: 0.0.4
#Erstellungsdatum: 26.11.2008
#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.

#Neu in dieser Version:
#Sicherung gegen unbeabsichtigtes Überschreiben von schon vorhandenen Clips eingebaut

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Funktionen++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Vorbereitung°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

installation_erfolgt ()
{
if [ ! -s ~/.dvb_script_gui.ini/pfad_hauptverzeichnis ]
then
	kdialog --error "Bitte zuerst Installation starten"
	exit
fi
}

voreinstellungen ()
{
brenngeschwindigkeit=8 #maximale Brenngeschwindigkeit
maxgroesse=4600000000 #DVD-Größe (für das Requantisieren)
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Für's Austesten °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

stop ()
{
kdialog --msgbox "Programm unterbrochen"
exit
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Kommanderfenster °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

fenster1 ()
{
echo "$1" > ~/.dvb_script_gui.ini/fortschrittfenster
}

fenster1_mehr ()
{
echo "$1" >> ~/.dvb_script_gui.ini/fortschrittfenster
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° Abbruch °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

benutzerabbruch ()
{
fenster1_mehr ""
fenster1_mehr "Abbruch durch den Benutzer."
programmende
}

funktionsabbruch ()
{
fenster1_mehr ""
fenster1_mehr "$1"
programmende
}

programmende ()
{
fenster1_mehr ""
fenster1_mehr "Ende"
kdialog --passivepopup "Programmende" 1000
fenster1 ""
exit
}


variablen ()
{
hauptverzeichnis=`cat ~/.dvb_script_gui.ini/pfad_hauptverzeichnis`

name[0]=mplex
name[1]=tcrequant
name[2]=dvdauthor
name[3]=ProjectX.jar
name[4]=normalize
name[5]=ffmpeg
name[6]=growisofs
name[7]=vlc
name[8]=mplayer

pfad[0]=`cat ~/.dvb_script_gui.ini/hilfsprogramme/pfad[0]`
pfad[1]=`cat ~/.dvb_script_gui.ini/hilfsprogramme/pfad[1]`
pfad[2]=`cat ~/.dvb_script_gui.ini/hilfsprogramme/pfad[2]`
pfad[3]=`cat ~/.dvb_script_gui.ini/hilfsprogramme/pfad[3]`
pfad[4]=`cat ~/.dvb_script_gui.ini/hilfsprogramme/pfad[4]`
pfad[5]=`cat ~/.dvb_script_gui.ini/hilfsprogramme/pfad[5]`
pfad[6]=`cat ~/.dvb_script_gui.ini/hilfsprogramme/pfad[6]`
pfad[7]=`cat ~/.dvb_script_gui.ini/hilfsprogramme/pfad[7]`

mplex=${pfad[0]}/${name[0]}
tcrequant=${pfad[1]}/${name[1]}
dvdauthor=${pfad[2]}/${name[2]}
pjx=${pfad[3]}/${name[3]}
normalize=${pfad[4]}/${name[4]}
ffmpeg=${pfad[5]}/${name[5]}
growisofs=${pfad[6]}/${name[6]}
vlc=${pfad[7]}/${name[7]}

x_ini=~/.dvb_script_gui.ini/X.ini.film

tmp_pfad1=${hauptverzeichnis}/temp/tmp1
tmp_pfad2=${hauptverzeichnis}/temp/tmp2
dvdstruktur_pfad=${hauptverzeichnis}/temp/struktur

sicherungs_pfad=${hauptverzeichnis}/save
screenshot_pfad=${hauptverzeichnis}/screenshot

aufnahme_pfad=`cat ~/.dvb_script_gui.ini/aufnahmeordner`
direktdruck_pfad=`cat ~/.dvb_script_gui.ini/schablonenordner`
clip_pfad=`cat ~/.dvb_script_gui.ini/clipordner`
}

playlist_aktualisieren ()
{
find $clip_pfad/* > ~/.mplayer/playlist
}

loeschen_tmp ()
{
fenster1_mehr "Löschen tmp, kann etwas dauern ..."
rm -r ${hauptverzeichnis}/temp/tmp1/* 2>/dev/null
rm -r ${hauptverzeichnis}/temp/tmp2/* 2>/dev/null
rm -r ${hauptverzeichnis}/temp/struktur/* 2>/dev/null
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Auswahl der Eingangsdateien°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

filmauswahl_dvd ()
{
brenn_pfad=${dvdstruktur_pfad}
filmauswahl
}

filmauswahl_ts ()
{
brenn_pfad=${tmp_pfad1}
filmauswahl
}

filmauswahl_clip ()
{
filmauswahl
}

filmauswahl ()
{
fenster1_mehr "Quelldatei auswählen ..."
quelldatei=`kdialog --caption "Filmauswahl" --geometry 600x500-0+0 --getopenfilename "${aufnahme_pfad}"`
if [ $? != 0 ]
then
	benutzerabbruch
fi
}

verzeichnisauswahl_dvd ()
{
verzeichnistyp="*_dvd"
verzeichnisauswahl
}

verzeichnisauswahl_ts ()
{
verzeichnistyp="*_ts"
verzeichnisauswahl
}

verzeichnisauswahl ()
{
fenster1_mehr "Quelldatei auswählem ..."
anzahl_der_sicherungen=`find $sicherungs_pfad/$verzeichnistyp -maxdepth 0 -type d | wc -l`
hilfsverzeichnis=`find $sicherungs_pfad/$verzeichnistyp -maxdepth 0 -type d`
case $anzahl_der_sicherungen in
	0)	funktionsabbruch "Es gibt nichts passendes zum Brennen. Das Script wird nun beendet." ;;
	1)	fenster1_mehr "Folgende Sicherung wird gebrannt: $hilfsverzeichnis"
		verzeichnis=$hilfsverzeichnis ;;
	*)	verzeichnis=`kdialog --combobox "Welche Datei soll gebrannt werden?" $hilfsverzeichnis`
		if [ $? != 0 ]
		then
			benutzerabbruch
		fi ;;
esac
brenn_pfad=$verzeichnis
}
#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Eingangsverarbeitung°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

#-----Schneiden und Demultiplexen-----
pjx_demux_gui ()
{
fenster1_mehr "ProjectX: Schneiden und demultiplexen"
java -jar ${pjx} -demux -gui -ini $x_ini -out ${tmp_pfad1} -name film "$quelldatei"
}

#-----Schneiden und Wandeln nach TS-----
pjx_ts_gui ()
{
fenster1_mehr "ProjectX: Schneiden und demultiplexen"
java -jar ${pjx} -tots -gui -split 4300 -ini $x_ini -out ${tmp_pfad1} -name film "$quelldatei"
}

mpeg1_input ()
{
fenster1_mehr "ffmpeg: Decodierung Audio"
${ffmpeg} -i "${quelldatei}" ${tmp_pfad1}/film.mp2 -vcodec copy ${tmp_pfad1}/film.m1v
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Bearbeitung°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

requantisieren ()
{
videogroesse=`du -bc ${tmp_pfad1}/*.m2v | cut -f1 | tail -n 1` #Berechnung des Requantisierungsfaktors
audio_summe=`du -bc ${tmp_pfad1}/*.ac3 ${tmp_pfad1}/*.mp2 | cut -f1 | tail -n 1`
audio_video_summe=`du -bc ${tmp_pfad1}/*.ac3 ${tmp_pfad1}/*.mp2 ${tmp_pfad1}/*.m2v | cut -f1 | tail -n 1`
requantisierungsfaktor=`echo "scale=8 ; ${videogroesse}/$((maxgroesse-audio_summe))*1.04" | bc`

if [ $audio_video_summe -ge $maxgroesse ] #Wenn der Film zu gross für eine einzige DVD ist, Requantisierung anstossen
then
	fenster1_mehr "tcrequant: Requantisieren mit Faktor ${requantisierungsfaktor}"
	${tcrequant} -d2 -i ${tmp_pfad1}/film.m2v -o ${tmp_pfad1}/film.requant -f ${requantisierungsfaktor}
	mv ${tmp_pfad1}/film.requant ${tmp_pfad1}/film.m2v
fi
}

#........mp2-Ton auf einheitliche Lautstärke bringen (-12dBfs)..........
normalisieren ()
{
mv ${tmp_pfad1}/film.mp2 ${tmp_pfad2}
rm ${hauptverzeichnis}/initialisierung/temp/tmp1/*.mp2

fenster1_mehr "ffmpeg: Ton decodieren"
${ffmpeg} -i ${tmp_pfad2}/film.mp2 ${tmp_pfad2}/film.mp2.wav

fenster1_mehr "normalize: Ton normalisieren"
${normalize} ${tmp_pfad2}/film.mp2.wav 2>~/.DVB_Script/fenster/Konsolenausgabe

fenster1_mehr "ffmpeg: Ton encodieren"
${ffmpeg} -i ${tmp_pfad2}/film.mp2.wav -acodec mp2 -ab 192k ${tmp_pfad1}/film.mp2

rm ${hauptverzeichnis}/initialisierung/temp/tmp2/*
}

ac3_behalten ()
{
if [ ! -e ${hauptverzeichnis}/initialisierung/temp/tmp1/*.ac3 ]
then
	funktionsabbruch "Der Clip enthält keinen AC3-Ton. Das Script wird nun beendet."
fi

rm ${hauptverzeichnis}/initialisierung/temp/tmp1/*.mp2
}

mp2_behalten ()
{
if [ ! -e ${hauptverzeichnis}/initialisierung/temp/tmp1/*.mp2 ]
then
	funktionsabbruch "Der Clip enthält keinen mp2-Ton. Das Script wird nun beendet."
fi

rm ${hauptverzeichnis}/initialisierung/temp/tmp1/*.ac3
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Multiplexen, Codieren°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

multiplexen ()
{
fenster1_mehr "mplex: Multiplexen, kann etwas dauern ..."
mpeg1_video=
mpeg2_video=
mp2_audio=
ac3_audio=

mpeg1_video=`find ${tmp_pfad1} | grep "m1v"`
mpeg2_video=`find ${tmp_pfad1} | grep "m2v"`
mp2_audio=`find ${tmp_pfad1} | grep "mp2"`
ac3_audio=`find ${tmp_pfad1} | grep "ac3"`

${mplex} -v1 -f8 -o ${tmp_pfad1}/film.mpg ${mpeg1_video} ${mpeg2_video} ${ac3_audio} ${mp2_audio}

if [ ! -e ${tmp_pfad1}/film.mpg ]
then
	funktionsabbruch "Es konnte keine Datei multiplext werden!"
fi
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Author'n°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

authoring_ohne_menue ()
{
fenster1_mehr "dvdauthor: Erzeugen der DVD-Struktur"
${dvdauthor} -o ${dvdstruktur_pfad} -t ${tmp_pfad1}/film.mpg  #VOBs und "Kapitel"-IFOs
${dvdauthor} -o ${dvdstruktur_pfad} -T #VIDEO_TS.BUP und VIDEO_TS.IFO
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Screenshots°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

screenshot ()
{
fenster1_mehr "vlc: Screenshot"
rm ${hauptverzeichnis}/screenshot/* 2>/dev/null
${vlc} --no-audio --snapshot-path ${screenshot_pfad} dvd://${brenn_pfad}
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Brennen°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

#----------Video-DVD--------------
brennen_video_dvd ()
{
fenster1_mehr "growisofs: Video-DVD brennen"
video_dvd_bereit
fenster1_mehr "Brennen beginnt"
${growisofs} -speed=${brenngeschwindigkeit} -dvd-compat -Z /dev/dvd -dvd-video ${brenn_pfad}
funktionsabbruch "Brennen fertig. Programm beendet"
}

video_dvd_bereit ()
{
${growisofs}  -dry-run -speed=${brenngeschwindigkeit} -dvd-compat -Z /dev/dvd -dvd-video ${brenn_pfad}
if [ $? = 0 ]
then
	return
else
	kdialog --warningcontinuecancel "DVD nicht bereit"
	if [ $? = 0 ]
	then
		video_dvd_bereit
	else
		benutzerabbruch
	fi
fi
}

#--------------Daten-DVD------------
brennen_ts ()
{
fenster1_mehr "growisofs: Daten-DVD brennen"
dvdzahl=`find ${brenn_pfad} -type f | wc -l`
fenster1_mehr ""
fenster1_mehr "Anzahl der notwendigen DVDs: ${dvdzahl}"

for((i=1; i<=${dvdzahl}; i++))
do
	loop_brennen_ts
done
funktionsabbruch "Brennen fertig. Programm beendet"
}

loop_brennen_ts ()
{
daten_dvd_bereit
kdialog --msgbox "Bitte DVD Nr.: $i einlegen"
if [ $? = 0 ]
then
	fenster1_mehr ""
	fenster1_mehr "Brennvorgang gestartet"
	${growisofs} -speed=${brenngeschwindigkeit} -Z /dev/dvd -allow-limited-size -R -J ${brenn_pfad}/"film($((i-1)))[remux].ts"
else
	benutzerabbruch
fi
}

daten_dvd_bereit ()
{
${growisofs} -dry-run -speed=${brenngeschwindigkeit} -Z /dev/dvd -allow-limited-size -R -J ${brenn_pfad}/"film($((i-1)))[remux].ts"
if [ $? = 0 ]
then
	return
else
	kdialog --warningcontinuecancel "DVD nicht bereit"
	if [ $? = 0 ]
	then
		loop_brennen_ts
	else
		benutzerabbruch
	fi
fi
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Sichern°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

sichern_dvd_struktur ()
{
fenster1_mehr "Sichern der DVD-Stuktur"
sicherungsordner="$(date +%Y%m%d%H%M%S)_dvd"
mkdir ${sicherungs_pfad}/${sicherungsordner}
mv ${dvdstruktur_pfad}/* ${sicherungs_pfad}/${sicherungsordner}
funktionsabbruch "Datei gesichert nach ${sicherungs_pfad}/${sicherungsordner}. Programm beendet"
}

sichern_ts ()
{
fenster1_mehr "Sichern des TS-File"
sicherungsordner="$(date +%Y%m%d%H%M%S)_ts"
mkdir ${sicherungs_pfad}/${sicherungsordner}
mv ${tmp_pfad1}/*.ts ${sicherungs_pfad}/${sicherungsordner}
funktionsabbruch "Datei gesichert nach ${sicherungs_pfad}/${sicherungsordner}. Programm beendet"
}

sichern_clip ()
{
fenster1_mehr "Speichern des Videoclips"
clipspeicher=`kdialog --title "$quelldatei" --getsavefilename ${clip_pfad}`
if [ $? != 0 ]
then
	benutzerabbruch
fi

if [ -e "${clipspeicher}" ]
then
	kdialog --yesno "Dieser Clip ist schon gespeichert. Überschreiben?"
	if [ $? = 0 ]
	then
		sichern_clip_ausfuehren
	fi
	sichern_clip
fi
sichern_clip_ausfuehren
}

sichern_clip_ausfuehren ()
{
mv ${tmp_pfad1}/film.mpg "${clipspeicher}"
playlist_aktualisieren
funktionsabbruch "Videoclip gespeichert: ${clipspeicher}"
}
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Hauptprogramm++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#-----Initialisierung-----
installation_erfolgt

exec 2> ~/.dvb_script_gui.ini/debugfenster

voreinstellungen
variablen
playlist_aktualisieren
loeschen_tmp

#-----untermenue_video_dvd-----

case $was_tun in

	11)	filmauswahl_dvd
		pjx_demux_gui
		requantisieren
		multiplexen
		authoring_ohne_menue
		screenshot
		brennen_video_dvd
		programmende ;;

	12)	filmauswahl_dvd
		pjx_demux_gui
		requantisieren
		multiplexen
		authoring_ohne_menue
		sichern_dvd_struktur
		programmende ;;

	13)	verzeichnisauswahl_dvd
		screenshot
		brennen_video_dvd
		programmende ;;
esac

#-----untermenue_ts-----

case $was_tun in

	21)	filmauswahl_ts
		pjx_ts_gui
		brennen_ts
		programmende ;;

	22)	filmauswahl_ts
		pjx_ts_gui
		sichern_ts
		programmende ;;

	23)	verzeichnisauswahl_ts
		brennen_ts
		programmende ;;
esac

#-----untermenue_videoclip-----

case $was_tun in

	31)	filmauswahl_clip
		pjx_demux_gui
		multiplexen
		sichern_clip
		programmende ;;

	32)	filmauswahl_clip
		pjx_demux_gui
		ac3_behalten
		multiplexen
		sichern_clip
		programmende ;;

	33)	filmauswahl_clip
		pjx_demux_gui
		mp2_behalten
		multiplexen
		sichern_clip
		programmende ;;

	34)	filmauswahl
		mpeg1_input
		multiplexen
		sichern_clip
		programmende ;;

	37)	filmauswahl_clip
		pjx_demux_gui
		mp2_behalten
		normalisieren
		multiplexen
		sichern_clip
		programmende ;;

	38)	filmauswahl
		mpeg1_input
		normalisieren
		multiplexen
		sichern_clip
		programmende ;;

esac

#----untermenue_direktdruck

case $was_tun in

	81)	oodraw -o $direktdruck_pfad/videodvd.odg ;;
	82)	oodraw -o $direktdruck_pfad/datendvd.odg ;;
esac


Vom DVB zur DVD, die GUI: Anleitungen - Installation - GUI-Kommanderscript - Arbeitsscript - Dokumentation


Zurück zur Multimedia-Übersicht