Dvb wiki script/Script
Version vom 20. Juli 2008, 08:28 Uhr von Escho (Diskussion | Beiträge) (kdialog: Abbrechen klappt nun)
#!/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