Dvb wiki script/Script: Unterschied zwischen den Versionen
Escho (Diskussion | Beiträge) (Programmerkennung beschleunigt) |
Escho (Diskussion | Beiträge) (Einige Optimierungen) |
||
| Zeile 8: | Zeile 8: | ||
#Name: Vom DVB zur DVD Teil 3 | #Name: Vom DVB zur DVD Teil 3 | ||
| − | #Version: 0.5. | + | #Version: 0.5.6 |
| − | #Erstellungsdatum: | + | #Erstellungsdatum: 15.6.2008 |
#Autor: escho (www.linux-club.de) | #Autor: escho (www.linux-club.de) | ||
#Benutzung auf eigene Gefahr | #Benutzung auf eigene Gefahr | ||
| Zeile 63: | Zeile 63: | ||
mkdir ${basisverzeichnis}/dvd_struktur | mkdir ${basisverzeichnis}/dvd_struktur | ||
mkdir ${basisverzeichnis}/dvd_sicherung | mkdir ${basisverzeichnis}/dvd_sicherung | ||
| − | |||
mkdir $basisverzeichnis/default | mkdir $basisverzeichnis/default | ||
mkdir $basisverzeichnis/screenshot | mkdir $basisverzeichnis/screenshot | ||
| Zeile 159: | Zeile 158: | ||
{ | { | ||
echo "*** Löschen der Arbeitsordner ***" | echo "*** Löschen der Arbeitsordner ***" | ||
| − | rm ${ | + | rm ${basisverzeichnis}/dvd_tmp/* |
| − | |||
rm ${dvdstruktur_pfad}/AUDIO_TS/* | rm ${dvdstruktur_pfad}/AUDIO_TS/* | ||
rm ${dvdstruktur_pfad}/VIDEO_TS/* | rm ${dvdstruktur_pfad}/VIDEO_TS/* | ||
| Zeile 290: | Zeile 288: | ||
echo "*** wav --> mp2 ***" | echo "*** wav --> mp2 ***" | ||
${ffmpeg} -i ${tmp_pfad}/film.mp2.wav -acodec mp2 -ab 192k ${tmp_pfad}/film.mp2 2>&1 | ${ffmpeg} -i ${tmp_pfad}/film.mp2.wav -acodec mp2 -ab 192k ${tmp_pfad}/film.mp2 2>&1 | ||
| − | rm ${ | + | rm ${basisverzeichnis}/dvd_tmp/*.wav |
| + | rm ${basisverzeichnis}/dvd_tmp/*.ac3 | ||
echo "*** erledigt" ; echo | echo "*** erledigt" ; echo | ||
} | } | ||
| Zeile 310: | Zeile 309: | ||
${mplex} -v1 -f8 -o ${tmp_pfad}/film.mpg ${mpeg1_video} ${mpeg2_video} ${mp2_audio} ${ac3_audio} | ${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" | ||
} | } | ||
| Zeile 362: | Zeile 367: | ||
sicherungsordner=$(date +%Y%m%d%H%M%S) | sicherungsordner=$(date +%Y%m%d%H%M%S) | ||
mkdir ${sicherungs_pfad}/${sicherungsordner} | mkdir ${sicherungs_pfad}/${sicherungsordner} | ||
| − | + | mv ${dvdstruktur_pfad}/* ${sicherungs_pfad}/${sicherungsordner} | |
| − | |||
kdialog --msgbox "Datei gesichert nach "${sicherungs_pfad}/${sicherungsordner} | kdialog --msgbox "Datei gesichert nach "${sicherungs_pfad}/${sicherungsordner} | ||
echo "*** erledigt" ; echo | echo "*** erledigt" ; echo | ||
| Zeile 374: | Zeile 378: | ||
sicherungsordner=$(date +%Y%m%d%H%M%S) | sicherungsordner=$(date +%Y%m%d%H%M%S) | ||
mkdir ${sicherungs_pfad}/${sicherungsordner} | mkdir ${sicherungs_pfad}/${sicherungsordner} | ||
| − | + | mv ${tmp_pfad}/*.ts ${sicherungs_pfad}/${sicherungsordner} | |
kdialog --msgbox "Datei gesichert nach "${sicherungs_pfad}/${sicherungsordner} | kdialog --msgbox "Datei gesichert nach "${sicherungs_pfad}/${sicherungsordner} | ||
echo "*** erledigt" ; echo | echo "*** erledigt" ; echo | ||
| Zeile 383: | Zeile 387: | ||
{ | { | ||
clipspeicher=`kdialog --title "$quelldatei" --getsavefilename /Videoclips/Archiv` | clipspeicher=`kdialog --title "$quelldatei" --getsavefilename /Videoclips/Archiv` | ||
| − | + | mv ${tmp_pfad}/film.mpg ${clipspeicher} | |
} | } | ||
Version vom 15. Juni 2008, 10:17 Uhr
| Vom DVB zur DVD, ein Wikibuch: Übersicht - Der Weg - Die Helferprogramme - Das Script - Installation - Bedienungsanleitung - Programmieranleitung |
Bitte die Installationsanleitung beachten!
#!/bin/bash
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++BESCHREIBUNG ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#Name: Vom DVB zur DVD Teil 3
#Version: 0.5.6
#Erstellungsdatum: 15.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
#------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
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++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 /Videoclips/Archiv`
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
| Vom DVB zur DVD, ein Wikibuch: Übersicht - Der Weg - Die Helferprogramme - Das Script - Installation - Bedienungsanleitung - Programmieranleitung |