Dvb wiki script/Script
- !/bin/bash
- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++BESCHREIBUNG ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- Name: DVB_Wiki_Buch_Script
- Version: 0.5.7
- Erstellungsdatum: 10.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 1 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` echo $was_tun }
- ...........Welcher Film / Clip...................
filmauswahl () { quelldatei=`kdialog --caption "Filmauswahl" --geometry 500x500-0+0 --getopenfilename ${aufnahme_pfad}`
if [ $? != 0 ] then exit fi }
- ............Welches Verzeichnis..................
verzeichnisauswahl () { verzeichnis=`kdialog --caption "Verzeichnisauswahl" --geometry 500x500-0+0 --getexistingdirectory ${sicherungs_pfad}`
if [ $? != 0 ] then exit fi echo $verzeichnis }
- ------------------------------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 was_tun=`aktionenauswahl` case $was_tun in
1) brenn_pfad=${dvdstruktur_pfad} #---------- Fernsehaufnahme schneiden und als Video-DVD brennen ------------------- filmauswahl pjx_demux_gui requantisieren multiplexen fehler authoring_ohne_menue abspielen brennen_video_dvd ;;
2) brenn_pfad=${dvdstruktur_pfad} #---------- Fernsehaufnahme schneiden und DVD-Struktur in Datei sichern ------ filmauswahl pjx_demux_gui requantisieren multiplexen fehler authoring_ohne_menue sichern_struktur ;;
3) brenn_pfad=`verzeichnisauswahl` #------------ DVD-Struktur brennen ----------------------- abspielen brennen_video_dvd ;;
4) brenn_pfad=${tmp_pfad} #----Fernsehaufnahme schneiden, TS als Daten-DVD brennen------ filmauswahl pjx_ts_gui brennen_ts ;;
5) filmauswahl #--------Fernsehaufnahme schneiden, TS und sichern -------------- pjx_ts_gui sichern_ts ;;
6) brenn_pfad=`verzeichnisauswahl` #---------gesichertes TS-file als Daten-DVD brennen --------------- 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