Dvb wiki script/Script
Version vom 19. August 2008, 19:11 Uhr von Escho (Diskussion | Beiträge) (überarbeitet für Script-Version 0.6.0)
Vom DVB zur DVD, ein Wikibuch: Übersicht - Der Weg - Die Helferprogramme - Das Script - Installation - Bedienungsanleitung - Programmieranleitung |
Bitte die Installationsanleitung beachten!
#!/bin/bash #++++++++++++++++++++++++++++++++++++++++++++++++++++++++BESCHREIBUNG ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #Name: DVB_Wiki_Buch_Script #Version: 0.6.0 #Erstellungsdatum: 18.8.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 #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Funktionen++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++# #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Für's Austesten°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° stop () { kdialog --msgbox "Programm unterbrochen" } #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Initialisierung°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° #-----Basisverzeichnis festlegen beim ersten Scriptaufruf----- basisverzeichnis_festlegen () { echo "*** Festlegen des Basisverzeichnisses ***" if [ ! -e ~/.dvb_wiki_script_arbeitsverzeichnis.txt ] then hilfsverzeichnis=`kdialog --caption "Name des Arbeitsverzeichnisses" --inputbox ~/ dvb_wiki_script` if [ $? = 0 ] then basisverzeichnis=~/`echo $hilfsverzeichnis | tr -d " "` if [ -e ${basisverzeichnis} ] then kdialog --passivepopup "Verzeichnis existiert schon! Bitte neu wählen" 3 basisverzeichnis_festlegen else kdialog --passivepopup "Die Verzeichnisstruktur wird in folgendem Arbeitsverzeichnis erstellt: ${basisverzeichnis}" 3 echo ${basisverzeichnis} > ~/.dvb_wiki_script_arbeitsverzeichnis.txt fi else kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3 exit fi fi echo "*** erledigt" ; echo } #-----Basisverzeichnis und Arbeitsverzeichnisse anlegen----- arbeitsverzeichnisse_erstellen () { basisverzeichnis=`cat ~/.dvb_wiki_script_arbeitsverzeichnis.txt` if [ ! -e ${basisverzeichnis} ] ; then mkdir ${basisverzeichnis} ; fi if [ ! -e ${basisverzeichnis}/dvd_aufnahme ] ; then mkdir ${basisverzeichnis}/dvd_aufnahme ; fi if [ ! -e ${basisverzeichnis}/dvd_tmp ] ; then mkdir ${basisverzeichnis}/dvd_tmp ; fi if [ ! -e ${basisverzeichnis}/dvd_tmp1 ] ; then mkdir ${basisverzeichnis}/dvd_tmp1 ; fi if [ ! -e ${basisverzeichnis}/dvd_struktur ] ; then mkdir ${basisverzeichnis}/dvd_struktur ; fi if [ ! -e ${basisverzeichnis}/dvd_sicherung ] ; then mkdir ${basisverzeichnis}/dvd_sicherung ; fi if [ ! -e ${basisverzeichnis}/dvd_default ] ; then mkdir ${basisverzeichnis}/dvd_default ; fi if [ ! -e ${basisverzeichnis}/dvd_screenshot ] ; then mkdir ${basisverzeichnis}/dvd_screenshot ; fi } programmerkennung () { echo "*** Programmerkennung ***" 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]=kaffeine for ((i=0 ; i<9 ; i++)) do touch $basisverzeichnis/dvd_default/pfad[$i].txt pfad[i]=`cat $basisverzeichnis/dvd_default/pfad[$i].txt` if [ ! -e ${pfad[i]}/${name[i]} ] then echo "${name[i]}: Datei wird gesucht" gefundene_pfade=`find /bin /home /opt /usr -type f -name ${name[i]} -printf "%h " 2>/dev/null` pfadanzahl=`echo "$gefundene_pfade" | wc -w` case "$pfadanzahl" in 0) kdialog --passivepopup "Das Programm wurde nicht gefunden. Bitte installieren." 3 exit ;; 1) echo "${name[i]}: Datei gefunden" ; echo echo $gefundene_pfade > $basisverzeichnis/dvd_default/pfad[$i].txt ;; *) auswahl_gefundene_pfade=`kdialog --caption "${name[i]}" --combobox "Bitte Pfad auswählen" $gefundene_pfade --default $gefundene_pfade` if [ $? = 0 ] then echo ${auswahl_gefundene_pfade} > $basisverzeichnis/dvd_default/pfad[$i].txt else kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3 exit fi echo "${name[i]}: Datei gefunden" ; echo ;; esac fi done echo "*** erledigt" ; echo } #-----Variablenzuweisungen zur besseren Lesbarkeit des Scriptes----- variablenzuweisungen () { 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[7]}/${name[7]} kaffeine=${pfad[8]}/${name[8]} aufnahme_pfad=${basisverzeichnis}/dvd_aufnahme tmp_pfad=${basisverzeichnis}/dvd_tmp dvdstruktur_pfad=${basisverzeichnis}/dvd_struktur sicherungs_pfad=${basisverzeichnis}/dvd_sicherung screenshot_pfad=$basisverzeichnis/dvd_screenshot default_pfad=${basisverzeichnis}/dvd_default clip_pfad=~/Videoclips } #-----Vorbereiten der X.ini's für ProjectX---- konfiguration () { #---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 #---Voreinstellungen--- brenngeschwindigkeit=8 #maximale Brenngeschwindigkeit maxgroesse=4600000000 #für DVD5 } #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Löschfunktionen°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° loeschen_temporaere_arbeitsordner () { echo "*** Löschen der temporären Arbeitsordner (kann etwas dauern)***" rm ${basisverzeichnis}/dvd_tmp/* 2>/dev/null rm ${basisverzeichnis}/dvd_tmp1/* 2>/dev/null rm -r ${basisverzeichnis}/dvd_struktur/* 2>/dev/null rmdir ${basisverzeichnis}/dvd_struktur/* 2>/dev/null echo "*** erledigt" ; echo } #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Aufgabenmenues°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° hauptmenue () { auswahl_hauptmenue=`kdialog --caption "Hauptmenue" --geometry 200x250+500+400 --radiolist "Bitte einen Aufgabenbereich wählen" \ 1 "VIDEO-DVD" on \ 2 "TS-Stream" off \ 3 "Videoclips" off` if [ $? != 0 ] then kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3 exit fi } untermenue_video_dvd () { brenn_pfad=${dvdstruktur_pfad} was_tun=`kdialog --caption "Video_DVD" --geometry 600x250+400+400 --radiolist "Was also soll genau getan werden?" \ 11 "VIDEO-DVD........Fernsehaufnahme schneiden --> als Video-DVD brennen" on \ 12 "VIDEO-DVD........Fernsehaufnahme schneiden --> DVD-Struktur in Datei sichern" off \ 13 "VIDEO-DVD........Sicherung brennen" off` if [ $? != 0 ] then kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3 exit fi } untermenue_ts () { was_tun=`kdialog --caption "Daten-DVD" --geometry 600x250+400+400 --radiolist "Was also soll genau getan werden?" \ 21 "TS-Stream..........Fernsehaufnahme schneiden --> TS als Daten-DVD brennen" on \ 22 "TS-Stream..........Fernsehaufnahme schneiden --> TS sichern" off \ 23 "TS-Stream..........Sicherung als Daten-DVD brennen" off` if [ $? != 0 ] then kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3 exit fi } untermenue_videoclip () { was_tun=`kdialog --caption "Videoclips" --geometry 600x250+400+400 --radiolist "Was also soll genau getan werden?" \ 31 "Videoclip.............Schneiden und speichern (Ton: MP2 normalisiert + AC3)" on \ 32 "Videoclip............ Schneiden und speichern (Ton: AC3)" off \ 33 "Videoclip............ Schneiden und speichern (Ton: MP2 normalisiert)" off \ 34 "Mpeg1-Clip............Schneiden und speichern (Ton: MP2 normalisiert)" off` if [ $? != 0 ] then kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3 exit fi } #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Auswahl der Eingangsdateien°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° filmauswahl_dvd () { brenn_pfad=${dvdstruktur_pfad} filmauswahl } filmauswahl_ts () { brenn_pfad=${tmp_pfad} filmauswahl } filmauswahl_clip () { filmauswahl } filmauswahl () { quelldatei=`kdialog --caption "Filmauswahl" --geometry 600x500-0+0 --getopenfilename ${aufnahme_pfad}` if [ $? != 0 ] then kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3 exit fi } verzeichnisauswahl_dvd () { verzeichnistyp="*_dvd" verzeichnisauswahl } verzeichnisauswahl_ts () { verzeichnistyp="*_ts" verzeichnisauswahl } verzeichnisauswahl () { 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) kdialog --passivepopup "Es gibt nichts passendes zum Brennen. Das Script wird nun beendet." 3 exit ;; 1) kdialog --passivepopup "Folgende Sicherung wird gebrannt: $hilfsverzeichnis" 3 verzeichnis=$hilfsverzeichnis ;; *) verzeichnis=`kdialog --combobox "Welche Datei soll gebrannt werden?" $hilfsverzeichnis` if [ $? != 0 ] then kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3 exit fi ;; esac brenn_pfad=$verzeichnis } #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Eingangsverarbeitung°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° #-----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 } #-----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 } mpeg1_input () { echo "*** mpeg1 demultiplexen ( Video copy, Ton --> wav) ***" ${ffmpeg} -i "${quelldatei}" ${tmp_pfad}/film.mp2 -vcodec copy ${tmp_pfad}/film.m1v echo "*** erledigt" ; echo } #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Bearbeitung°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° 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 --passivepopup "Es wird mit folgendem Faktor requantifiziert: ${requantisierungsfaktor}" 3 ${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 } #........mp2-Ton auf einheitliche Lautstärke bringen (-12dBfs).......... normalisieren () { mv ${basisverzeichnis}/dvd_tmp/film.mp2 ${basisverzeichnis}/dvd_tmp1 rm ${basisverzeichnis}/dvd_tmp/*.mp2 echo "*** Ton decodieren ***" ${ffmpeg} -i ${basisverzeichnis}/dvd_tmp1/film.mp2 ${basisverzeichnis}/dvd_tmp1/film.mp2.wav echo "*** Ton normalisieren ***" ${normalize} -v ${basisverzeichnis}/dvd_tmp1/film.mp2.wav 2>&1 echo "*** Ton encodieren ***" ${ffmpeg} -i ${basisverzeichnis}/dvd_tmp1/film.mp2.wav -acodec mp2 -ab 192k ${tmp_pfad}/film.mp2 2>&1 rm ${basisverzeichnis}/dvd_tmp1/* echo "*** erledigt" ; echo } ac3_behalten () { if [ ! -e ${basisverzeichnis}/dvd_tmp/*.ac3 ] then kdialog --passivepopup "Der Clip enthält keinen AC3-Ton. Das Script wird nun beendet." 3 exit fi rm ${basisverzeichnis}/dvd_tmp/*.mp2 } mp2_behalten () { if [ ! -e ${basisverzeichnis}/dvd_tmp/*.mp2 ] then kdialog --passivepopup "Der Clip enthält keinen mp2-Ton. Das Script wird nun beendet." 3 exit fi rm ${basisverzeichnis}/dvd_tmp/*.ac3 } #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Multiplexen, Codieren°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° multiplexen () { echo "*** Multiplexen ***" echo "***Bearbeitung läuft - kann etwas dauern" 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} 2>/dev/null if [ ! -e ${tmp_pfad}/film.mpg ] then echo "*** Fehler *** Error ***Fehler ***" kdialog --error "Es konnte keine Datei multiplext werden!" exit fi echo "*** erledigt" ; echo } #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Author'n°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° 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 } #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Ergebniskontrolle°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° abspielen () { echo "*** Abspielen ***" echo echo "*****************************************" echo "*** Screenshot mit Strg + s ***" echo "*** Weiter mit Strg + q ***" echo "*****************************************" echo $kaffeine -nofork --geometry 600x500-0+0 ${brenn_pfad} echo "*** erledigt" ; echo } #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Brennen°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° 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 } 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 } #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Sichern°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° sichern_dvd_struktur () { echo "*** DVD-Struktur sichern ***" sicherungsordner="$(date +%Y%m%d%H%M%S)_dvd" mkdir ${sicherungs_pfad}/${sicherungsordner} mv ${dvdstruktur_pfad}/* ${sicherungs_pfad}/${sicherungsordner} kdialog --msgbox "Datei gesichert nach "${sicherungs_pfad}/${sicherungsordner} echo "*** erledigt" ; echo } sichern_ts () { echo "*** TS sichern ***" sicherungsordner="$(date +%Y%m%d%H%M%S)_ts" mkdir ${sicherungs_pfad}/${sicherungsordner} mv ${tmp_pfad}/*.ts ${sicherungs_pfad}/${sicherungsordner} kdialog --msgbox "Datei gesichert nach "${sicherungs_pfad}/${sicherungsordner} echo "*** erledigt" ; echo } sichern_clip () { clipspeicher=`kdialog --title "$quelldatei" --getsavefilename ${clip_pfad}` mv ${tmp_pfad}/film.mpg "${clipspeicher}" } #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Hauptprogramm++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #-----Initialisierung----- basisverzeichnis_festlegen arbeitsverzeichnisse_erstellen programmerkennung variablenzuweisungen konfiguration loeschen_temporaere_arbeitsordner #-----Hauptmenue----- hauptmenue case $auswahl_hauptmenue in 1) untermenue_video_dvd ;; 2) untermenue_ts ;; 3) untermenue_videoclip ;; esac #-----untermenue_video_dvd----- case $was_tun in 11) filmauswahl_dvd #Fernsehaufnahme schneiden und als Video-DVD brennen pjx_demux_gui requantisieren multiplexen authoring_ohne_menue abspielen brennen_video_dvd ;; 12) filmauswahl_dvd #Fernsehaufnahme schneiden und DVD-Struktur in Datei sichern pjx_demux_gui requantisieren multiplexen authoring_ohne_menue abspielen sichern_dvd_struktur ;; 13) verzeichnisauswahl_dvd #DVD-Struktur brennen abspielen brennen_video_dvd ;; esac #-----untermenue_ts----- case $was_tun in 21) filmauswahl_ts #Fernsehaufnahme schneiden, TS als Daten-DVD brennen pjx_ts_gui brennen_ts ;; 22) filmauswahl_ts #Fernsehaufnahme schneiden, TS und sichern pjx_ts_gui sichern_ts ;; 23) verzeichnisauswahl_ts #gesichertes TS-file als Daten-DVD brennen brennen_ts ;; esac #-----untermenue_videoclip----- case $was_tun in 31) filmauswahl_clip #DVB-Clip: Schneiden und speichern (Ton: MP2 normalisiert + AC3) pjx_demux_gui normalisieren multiplexen sichern_clip ;; 32) filmauswahl_clip #DVB-Clip: Schneiden und speichern (Ton: AC3) pjx_demux_gui ac3_behalten multiplexen sichern_clip ;; 33) filmauswahl_clip #DVB-Clip: Schneiden und speichern (Ton: MP2 normalisiert) pjx_demux_gui mp2_behalten multiplexen sichern_clip ;; 34) filmauswahl #Mpeg1-Clip: Schneiden und speichern (Ton: MP2 normalisiert) mpeg1_input normalisieren multiplexen sichern_clip ;; esac exit
Vom DVB zur DVD, ein Wikibuch: Übersicht - Der Weg - Die Helferprogramme - Das Script - Installation - Bedienungsanleitung - Programmieranleitung |