Dvb wiki script/Script

Aus Linupedia.org
Version vom 20. Juli 2008, 08:28 Uhr von Escho (Diskussion | Beiträge) (kdialog: Abbrechen klappt nun)
Wechseln zu: Navigation, Suche
#!/bin/bash

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++BESCHREIBUNG ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#Name: DVB_Wiki_Buch_Script
#Version: 0.5.8
#Erstellungsdatum: 19.7.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

#++++++++++++++++++++++++++++++++++++++++Evt. vom Benutzer anzupassen +++++++++++++++++++++++++++++++++++++++++++++++++++++++++


#-------------Basisverzeichnis---------------

basisverzeichnis=~/filme #ausschließlich im Heimatverzeichnis vorgesehen

#----------------DVD-Grösse------------------

maxgroesse=4600000000 #für DVD5

#------------Brenngeschwindigkeit------------

brenngeschwindigkeit=8 #maximal

#------Pfade, in denen nach den Helferprogrammen gesucht wird-------

suchpfade="/bin $HOME /opt /usr"

#+++++++++++++++++++++++++++++++++++++++++++++++++++++Fehlermeldungen abschalten+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

exec 2>/dev/null

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++Installationsroutine+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#------------- Programmnamen --------------

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


#-----------Anlegen der notwendigen Verzeichnisse------------------

mkdir ${basisverzeichnis}

mkdir ${basisverzeichnis}/dvd_aufnahme
mkdir ${basisverzeichnis}/dvd_tmp
mkdir ${basisverzeichnis}/dvd_struktur
mkdir ${basisverzeichnis}/dvd_sicherung
mkdir $basisverzeichnis/default
mkdir $basisverzeichnis/screenshot

#--------Überprüfung, ob die Programme vorhanden sind und Anlegen der Programmpfade---------

echo "*** Programmerkennung ***"
for ((i=0 ; i<9 ; i++))
do
	pfad[i]=`cat $basisverzeichnis/default/pfad[$i].txt`
	if [ ! -e ${pfad[i]}/${name[i]} ]
	then
		echo "${name[i]}:      Datei wird gesucht"
		gefundene_pfade=`find ${suchpfade} -type f -name ${name[i]} -printf "%h "`
		pfadanzahl=`echo "$gefundene_pfade" | wc -w`

		case "$pfadanzahl" in
			0)	kdialog --msgbox "Programm kann nicht gefunden werden"
				exit ;;
			1)	echo "${name[i]}:      Datei gefunden"
				echo $gefundene_pfade > $basisverzeichnis/default/pfad[$i].txt;;
			*)	kdialog --combobox "Welcher Pfad" $gefundene_pfade > $basisverzeichnis/default/pfad[$i].txt
				echo "${name[i]}:      Datei gefunden"
		esac
	fi
done
echo "*** erledigt" ; echo

#----------------------Variablenzuweisungen zur besseren Lesbarkeit des Scriptes-------------------------

#---Programme---
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]}
kdialog_pfad=${pfad[7]}/${name[7]}
mplayer_pfad=${pfad[8]}/${name[8]}

#---Pfade---
aufnahme_pfad=${basisverzeichnis}/dvd_aufnahme
tmp_pfad=${basisverzeichnis}/dvd_tmp
dvdstruktur_pfad=${basisverzeichnis}/dvd_struktur
sicherungs_pfad=${basisverzeichnis}/dvd_sicherung
screenshot_pfad=$basisverzeichnis/screenshot
default_pfad=${basisverzeichnis}/default
clip_pfad=~/Videoclips

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Konfiguration PJX ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#-------------X.ini für Filmbearbeitung----------------

echo \
"# Application
Application.Agreement=1
Application.Language=de

# WindowPosition
WindowPosition.Main.Height=670
WindowPosition.Main.Width=866
WindowPosition.Main.X=500
WindowPosition.Main.Y=0

# OptionPanel
OptionPanel.NormalLog=0
OptionPanel.closeOnEnd=1" > ${default_pfad}/X.ini.film

#-------------X.ini für Videoclips (Ton decodieren)----------------

echo \
"# Application
Application.Agreement=1
Application.Language=de

# WindowPosition
WindowPosition.Main.Height=670
WindowPosition.Main.Width=866
WindowPosition.Main.X=500
WindowPosition.Main.Y=0

# OptionPanel
OptionPanel.NormalLog=0
OptionPanel.closeOnEnd=1

# AudioPanel
AudioPanel.decodeMpgAudio=1" > ${default_pfad}/X.ini.clip

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

#--------------------Vorbereitungen / Fehlerbehandlung------------------------------------

#............Löschen der Arbeitsordner........................
del_ordner ()
{
echo "*** Löschen der Arbeitsordner ***"
rm ${basisverzeichnis}/dvd_tmp/*
rm ${dvdstruktur_pfad}/AUDIO_TS/*
rm ${dvdstruktur_pfad}/VIDEO_TS/*
rmdir ${dvdstruktur_pfad}/AUDIO_TS
rmdir ${dvdstruktur_pfad}/VIDEO_TS
echo "*** erledigt" ; echo
}

#..........Fehler, da mplex nichts multiplexen kann............
fehler ()
{
if [ ! -e ${tmp_pfad}/film.mpg ]
then
	echo "*** Fehler *** Error ***Fehler ***"
	kdialog --error "Es konnte keine Datei multiplext werden!"
	exit
fi
}

#----------------------------Auswahlmenues----------------------------------------

#..................Aufgaben.........................
aktionenauswahl ()
{
was_tun=`kdialog --caption "Videobearbeitung" --geometry 500x300-0+0 --radiolist "Was soll also getan werden?" \
	1	"VIDEO-DVD........Fernsehaufnahme schneiden --> als Video-DVD brennen" on \
	2	"VIDEO-DVD........Fernsehaufnahme schneiden --> DVD-Struktur in Datei sichern" off \
	3	"VIDEO-DVD........DVD-Struktur brennen" off \
	4	"TS-Stream..........Fernsehaufnahme schneiden --> TS als Daten-DVD brennen" off \
	5	"TS-Stream..........Fernsehaufnahme schneiden --> TS sichern" off \
	6	"TS-Stream..........TS-file als Daten-DVD brennen" off \
	7	"Videoclip.............DVB-Clip schneiden, Ton normalisieren, speichern" off \
	8	"Videoclip.............Mpeg1-Clip Ton normalisieren, speichern" off`
if [ $? = 0 ]
then
	echo $was_tun
else
	kdialog --msgbox "Programm vom Benutzer abgebrochen"
	exit
fi
}

#...........Welcher Film / Clip...................
filmauswahl ()
{
quelldatei=`kdialog --caption "Filmauswahl" --geometry 500x500-0+0 --getopenfilename ${aufnahme_pfad}`
if [ $? = 0 ]
then
	echo $quelldatei
else
	kdialog --msgbox "Programm vom Benutzer abgebrochen"
	exit
fi
}

#............Welches Verzeichnis..................
verzeichnisauswahl ()
{
verzeichnis=`kdialog --caption "Verzeichnisauswahl" --geometry 500x500-0+0 --getexistingdirectory ${sicherungs_pfad}`
if [ $? = 0 ]
then
	echo $verzeichnis
else
	kdialog --msgbox "Programm vom Benutzer abgebrochen"
	exit
fi
}

#------------------------------Input / Demux / Cut------------------------------------

#......projectx mit gui zum schneiden und demultiplexen.....
pjx_demux_gui ()
{
echo "*** DVB mit PJX ***"
java -jar ${pjx} -demux -gui  -ini ${default_pfad}/X.ini.film -out ${tmp_pfad} -name film "$quelldatei" 1>/dev/null
echo "*** erledigt" ; echo
}

#......projectx mit gui zum schneiden und wandeln nach ts.....
pjx_ts_gui ()
{
echo "*** TS mit PJX ***"
java -jar ${pjx} -tots -gui -split 4300 -ini ${default_pfad}/X.ini.film -out ${tmp_pfad} -name film "$quelldatei" 1>/dev/null
echo "*** erledigt" ; echo
}

#.....projectx mit gui zum schneiden und Ton decodieren.......
pjx_clip ()
{
echo "*** Ton --> wav mit PJX"
java -jar ${pjx} -demux -gui  -ini ${default_pfad}/X.ini.clip -out ${tmp_pfad} -name film "$quelldatei" 1>/dev/null
echo "*** erledigt" ; echo
}

#..................ffmpeg für mgeg1-Video (VCD)................
mpeg1_input ()
{
echo "*** mpeg1 demultiplexen ( Video copy, Ton --> wav) ***"
${ffmpeg} -i "${quelldatei}" ${tmp_pfad}/film.mp2.wav -vcodec copy ${tmp_pfad}/film.m1v
mv "${tmp_pfad}/film.wav" "${tmp_pfad}/film.mp2.wav"
echo "*** erledigt" ; echo
}


#----------------------------Film zu lang für 1 DVD-------------------------------------

#..............Requantisieren.....................
requantisieren ()
{
videogroesse=`du -bc ${tmp_pfad}/*.m2v | cut -f1 | tail -n 1` #Berechnung des Requantisierungsfaktors
audio_summe=`du -bc ${tmp_pfad}/*.ac3 ${tmp_pfad}/*.mp2 | cut -f1 | tail -n 1`
audio_video_summe=`du -bc ${tmp_pfad}/*.ac3 ${tmp_pfad}/*.mp2 ${tmp_pfad}/*.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
	echo "*** Requantisieren ***"
	kdialog --msgbox "Requantisierung mit Faktor "${requantisierungsfaktor}" notwendig"
	${tcrequant} -d2 -i ${tmp_pfad}/film.m2v -o ${tmp_pfad}/film.requant -f ${requantisierungsfaktor}
	mv ${tmp_pfad}/film.requant ${tmp_pfad}/film.m2v
	echo "*** erledigt" ; echo
fi
}

#----------------------------encodieren / bearbeiten-------------------------------------

#........Ton auf einheitliche Lautstärke bringen (-12dBfs)..........
normalisieren ()
{
echo "*** Ton normalisieren ***"
${normalize} -v ${tmp_pfad}/film.mp2.wav 2>&1
echo "*** erledigt" ; echo
}

#.............Ton.wav encodieren zu Ton.mp2..............
encode2mp2 ()
{
echo "*** wav --> mp2 ***"
${ffmpeg} -i ${tmp_pfad}/film.mp2.wav -acodec mp2 -ab 192k ${tmp_pfad}/film.mp2 2>&1
rm ${basisverzeichnis}/dvd_tmp/*.wav
rm ${basisverzeichnis}/dvd_tmp/*.ac3
echo "*** erledigt" ; echo
}

#.....multiplexen
multiplexen ()
{
echo "*** Multiplexen ***"
echo "***Bearbeitung läuft"
mpeg1_video=
mpeg2_video=
mp2_audio=
ac3_audio=

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

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

rm ${basisverzeichnis}/dvd_tmp/*.m1v
rm ${basisverzeichnis}/dvd_tmp/*.m2v
rm ${basisverzeichnis}/dvd_tmp/*.mp2
rm ${basisverzeichnis}/dvd_tmp/*.ac3
echo "*** erledigt"
}



#----------------------------------DVD-Authoring----------------------------------------

#.........Authoring ohne DVD-Menue...............
authoring_ohne_menue ()
{
echo "*** Authoring der DVD ***"
${dvdauthor} -o ${dvdstruktur_pfad} -t ${tmp_pfad}/film.mpg 2>&1 #VOBs und "Kapitel"-IFOs
${dvdauthor} -o ${dvdstruktur_pfad} -T #VIDEO_TS.BUP und VIDEO_TS.IFO
echo "*** erledigt" ; echo
}


#---------------------------------DVD brennen--------------------------------------------

#..............Video-DVD...............
brennen_video_dvd ()
{
echo "*** Video-DVD brennen ***"
kdialog --msgbox "Bitte leere DVD einlegen"
${growisofs} -speed=${brenngeschwindigkeit} -dvd-compat -Z /dev/dvd -dvd-video ${brenn_pfad} 2>&1
kdialog --msgbox "Bitte DVD entnehmen"
echo "*** erledigt" ; echo
}

#.............Daten-DVD................
brennen_ts ()
{
echo "*** Daten-DVD brennen ***"
dvdzahl=`find ${brenn_pfad} -type f | wc -l`
kdialog --msgbox "Anzahl der notwendigen DVDs: ${dvdzahl}"

for((i=1; i<=${dvdzahl}; i++))
do
	kdialog --msgbox "Bitte DVD Nr.: $i einlegen"
	${growisofs} -speed=${brenngeschwindigkeit} -Z /dev/dvd  -allow-limited-size -R -J ${brenn_pfad}/"film($((i-1)))"* 2>&1
	kdialog --msgbox "Bitte DVD entnehmen"
done

kdialog --msgbox "fertig"
echo "*** erledigt" ; echo
}

#--------------------------Filme / Clips auf Festplatte sichern--------------------------

#............DVD-Struktur................
sichern_struktur ()
{
echo "*** DVD-Struktur sichern ***"
sicherungsordner=$(date +%Y%m%d%H%M%S)
mkdir ${sicherungs_pfad}/${sicherungsordner}
mv ${dvdstruktur_pfad}/* ${sicherungs_pfad}/${sicherungsordner}
kdialog --msgbox "Datei gesichert nach "${sicherungs_pfad}/${sicherungsordner}
echo "*** erledigt" ; echo
}

#..................TS...................
sichern_ts ()
{
echo "*** TS sichern ***"
sicherungsordner=$(date +%Y%m%d%H%M%S)
mkdir ${sicherungs_pfad}/${sicherungsordner}
mv ${tmp_pfad}/*.ts ${sicherungs_pfad}/${sicherungsordner}
kdialog --msgbox "Datei gesichert nach "${sicherungs_pfad}/${sicherungsordner}
echo "*** erledigt" ; echo
}

#................Clip...................
clip_speichern ()
{
clipspeicher=`kdialog --title "$quelldatei" --getsavefilename ${clip_pfad}`
echo $clipspeicher
mv ${tmp_pfad}/film.mpg "${clipspeicher}"
}

#---------------------------- Ergebnis bearbeiten ------------------------

#....................DVD-Struktur abspielen (Screenshot)..................
abspielen ()
{
echo "*** DVD-Struktur abspielen ***"
echo
echo "*************************************************"
echo "* Für Screenshots folgende Taste drücken:   s   *"
echo "* Abspielen beenden mit Taste:             esc  *"
echo "*************************************************"

cd ${screenshot_pfad}
${mplayer_pfad} -vf screenshot -geometry 100%:0% dvd://1 -dvd-device ${brenn_pfad} 1>/dev/null

echo "*** erledigt"
}

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Hauptprogramm ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

del_ordner
aktionenauswahl
case $was_tun in

	1)	filmauswahl #---------- Fernsehaufnahme schneiden und als Video-DVD brennen -------------------
		brenn_pfad=${dvdstruktur_pfad}
		pjx_demux_gui
		requantisieren
		multiplexen
		fehler
		authoring_ohne_menue
		abspielen
		brennen_video_dvd ;;

	2)	filmauswahl #---------- Fernsehaufnahme schneiden und DVD-Struktur in Datei sichern ------
		brenn_pfad=${dvdstruktur_pfad}
		pjx_demux_gui
		requantisieren
		multiplexen
		fehler
		authoring_ohne_menue
		sichern_struktur ;;

	3)	verzeichnisauswahl #------------ DVD-Struktur brennen -----------------------
		brenn_pfad=${verzeichnis}
		abspielen
		brennen_video_dvd ;;

	4)	filmauswahl #----Fernsehaufnahme schneiden, TS als Daten-DVD brennen------
		brenn_pfad=${tmp_pfad}
		pjx_ts_gui
		brennen_ts ;;

	5)	filmauswahl #--------Fernsehaufnahme schneiden, TS und sichern --------------
		pjx_ts_gui
		sichern_ts ;;

	6)	verzeichnisauswahl #---------gesichertes TS-file als Daten-DVD brennen ---------------
		brenn_pfad=${verzeichnis}
		brennen_ts ;;

	7)	filmauswahl #---------DVB-Clip schneiden, normalisieren, speichern
		pjx_clip
		normalisieren
		encode2mp2
		multiplexen
		fehler
		clip_speichern;;

	8)	filmauswahl #-------mpeg1-Clip schneiden, normalisieren, speichern
		mpeg1_input
		normalisieren
		encode2mp2
		multiplexen
		fehler
		clip_speichern ;;
esac

kdialog --msgbox "Bearbeitung beendet"

exit 0 #programmende