Dvb wiki script/Script
Version vom 3. Juni 2008, 17:38 Uhr von Escho (Diskussion | Beiträge) (Die Seite wurde neu angelegt: <pre> #!/bin/sh #++++++++++++++++++++++++++++++++++++++++++++++++++++++++BESCHREIBUNG ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #Name: Vom DVB zur ...)
#!/bin/sh
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++BESCHREIBUNG ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#Name: Vom DVB zur DVD Teil 3
#Version: 0.5.2
#Erstellungsdatum: 1.6.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
#+++++++++++++++++++++++++++++++++++++++++++++++++++++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}/dvd_log
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 / -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-------------------------
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]}
inst_pfad_pjx=${pfad[3]}
aufnahme_pfad=${basisverzeichnis}/dvd_aufnahme
tmp_pfad=${basisverzeichnis}/dvd_tmp
dvdstruktur_pfad=${basisverzeichnis}/dvd_struktur
sicherungs_pfad=${basisverzeichnis}/dvd_sicherung
screenshot_pfad=$basisverzeichnis/screenshot
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++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" > ${inst_pfad_pjx}/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" > ${inst_pfad_pjx}/X.ini.clip
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Funktionen ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#--------------------Vorbereitungen / Fehlerbehandlung------------------------------------
#............Löschen der Arbeitsordner........................
del_ordner ()
{
echo "*** Löschen der Arbeitsordner ***"
rm ${log_pfad}/*
rm ${tmp_pfad}/*
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 ***"
cp ${inst_pfad_pjx}/X.ini.film ${inst_pfad_pjx}/X.ini
java -jar ${pjx} -demux -gui -ini ${inst_pfad_pjx}/X.ini -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 ***"
cp ${inst_pfad_pjx}/X.ini.film ${pfad[3]}/X.ini
java -jar ${pjx} -tots -gui -split 4300 -ini ${inst_pfad_pjx}/X.ini -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"
cp ${inst_pfad_pjx}/X.ini.clip ${inst_pfad_pjx}/X.ini
java -jar ${pjx} -demux -gui -ini ${inst_pfad_pjx}/X.ini -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
echo "*** erledigt" ; echo
}
#.....multiplexen mpeg2-Video, AC3- oder/und mp2-Audio....
multiplexen ()
{
echo "*** Multiplexen ***"
echo "***Bearbeitung läuft"
if [ -e ${tmp_pfad}/film.mp2 -a -e ${tmp_pfad}/film.ac3 ] #Erkennung der Tonformate
then
tondat="ac3 und mp2"
else tondat="mp2"
fi
case $tondat in #multiplexen in Abhängigkeit der vorhandenen Tonformate
"ac3 und mp2") ${mplex} -v1 -f8 -o ${tmp_pfad}/film.mpg ${tmp_pfad}/film.m2v ${tmp_pfad}/*.mp2 ${tmp_pfad}/*.ac3;;
"mp2") ${mplex} -v0 -f8 -o ${tmp_pfad}/film.mpg ${tmp_pfad}/film.m2v ${tmp_pfad}/*.mp2;;
esac
echo "*** erledigt" ; echo
}
#.........multiplexen mpeg1-Video, mp2-Audio.................
mplex_mpeg1 ()
{
echo "*** Multiplexen ***"
echo "***Bearbeitung läuft"
${mplex} -f8 -o ${tmp_pfad}/film.mpg ${tmp_pfad}/film.m1v ${tmp_pfad}/*.mp2
echo "*** erledigt" ; echo
}
#----------------------------------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 mit dvdauthor
${dvdauthor} -o ${dvdstruktur_pfad} -T #VIDEO_TS.BUP und VIDEO_TS.IFO mit dvdauthor
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)))[remux]".ts 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}
cp -v -r ${dvdstruktur_pfad}/VIDEO_TS ${sicherungs_pfad}/${sicherungsordner}
cp -v -r ${dvdstruktur_pfad}/AUDIO_TS ${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}
cp -v ${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 /Videoclips/Archiv`
cp ${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 #,wenn zu gross für DVD
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
mplex_mpeg1
fehler
clip_speichern ;;
esac
kdialog --msgbox "Bearbeitung beendet"
exit 0 #programmende