Dvb wiki script/Programmieranleitung: Unterschied zwischen den Versionen

Aus Linupedia.org
Wechseln zu: Navigation, Suche
(Bis zum Ende)
(für Scriptversion 0.6.0 überarbeitet)
Zeile 1: Zeile 1:
 +
 
  {{Dvbscript navigationsbox}}
 
  {{Dvbscript navigationsbox}}
In diesem Artikel wird näher darauf eingegangen, wie das Script aufgebaut ist und warum es so funktioniert, wie es funktioniert.
+
In diesem Artikel wird näher darauf eingegangen, wie das Script aufgebaut ist und warum es so funktioniert, wie es funktioniert. Beschrieben wird dies an Hand der Scriptversion 0.6.0.
  
Dazu habe ich einen Ausdruck der Version 0.5.5 gemacht und dabei festgestellt, daß es ganz schön umfangreich geworden
+
=Die Funktionen=
ist, das was ich da programmiert habe. Es ist also an Zeit, zu Papier (bzw. auf den Bildschirm) zu bringen, was im Script im Einzelnen vor sich geht.
 
  
Dafür gibt es zwei Gründe. Zum einen soll der interessierte Nutzer in die Lage versetzt werden, das Script für sich selber zu erweitern bzw. zu ändern. Und
+
==<font color="green"> Für's Austesten </font>==
zum anderen möchte ich selbst nachschauen können, warum ich Schritt x so programmiert habe und nicht anders (Purer Eigennutz also).
 
  
Greifen wir es also an und schauen uns zusammen den Aufbau des Scriptes an:
+
===<font color="olive"> stop () </font>===
 +
Ist für Fehlersuche und Debugging gedacht und hält das Script an der gewünschten Stelle an.
  
==<font color="green"> Beschreibung </font>==
+
==<font color="green"> Initialisierung </font>==
  
In diesem Abschnitt stehen ein paar allgemeine Daten über das Script.
+
===<font color="olive"> basisverzeichnis_festlegen () </font>===
 
+
In der versteckten Datei ~/.dvb_wiki_script_arbeitsverzeichnis.txt wird der Pfad zum Basisverzeichnis gespeichert. In diesem Basisverzeichnis befinden sich die Arbeitsordner des Scripts. Ist diese Textdatei nicht vorhanden, ist das ein Indiz dafür, daß das Script zum ersten Mal ausgeführt wird.
==<font color="green"> Evt. vom Benutzer anzupassen </font>==
+
if [ ! -e ~/.dvb_wiki_script_arbeitsverzeichnis.txt ]
 
+
Wenn die Textdatei nicht vorhanden ist, das Script also zum ersten Mal Läuft, dann
Folgende Variablen können, wenn es sein muß, an die eigenen Gegebenheiten anpepasst werden
+
hilfsverzeichnis=`kdialog --caption "Name des Arbeitsverzeichnisses" --inputbox ~/ dvb_wiki_script`
 
+
Frage nach dem gewünschten Basisverzeichnis
*'''$basisverzeichnis''': Diese Variable enthält den Pfad zum sogenannten Basiverzeichnis. In diesem Verzeichnis werden vom Script weitere Arbeitsverzeichnisse angelegt.
+
*'''kdialog''': KDE-Dialogbox
 
+
*'''--caption "Name des Arbeitsverzeichnisses"''': mit dem Titel "Name des Arbeitsverzeichnissses"
Um eine wilde Jongliererei mit Rechten zu umgehen, muß das Basisverzeichis im Heimatverzeichnis des Benutzers liegen. Existiert der Default-Pfad bereits
+
*'''--inputbox''': welche als Eingabebox verwendet wird
und/oder wird er von anderen Anwendungen benutzt, muß in die Variable ein anderer Pfadname eingetragen werden.
+
*'''~/''': In der Box wird der Pfad zum persönlichen Heimatverzeichnis als Beschreibung angezeigt
 
+
*'''dvb_wiki_script''': Als Standardeingabe wird "dvb_wiki_script" festgelegt
Aber, wie gesagt, im Heimatverzeichnis bleiben!
+
*'''hilfsverzeichnis''': In diese Variable wird die Eingabe gespeichert
 +
if [ $? = 0 ]
 +
Wenn die Eingabe mit "OK" bestätigt wurde, dann
 +
basisverzeichnis=~/`echo $hilfsverzeichnis | tr -d " "`
 +
werden eventuelle Leerzeichen aus der Eingabe entfernt (tr -d " ")und das Ergebnis in die Variable "basisverzeichnis" geschrieben
 +
if [ -e ${basisverzeichnis} ]
 +
Existiert bereits ein "basisverzeichnis" an dem gewünschten Ort, dann
 +
kdialog --passivepopup "Verzeichnis existiert schon! Bitte neu wählen" 3
 +
basisverzeichnis_festlegen
 +
erfolgt ein Hinweis auf diese Tatsache. Nach drei Sekunden verschwindet die Popupbox und es wird die Funktion "basisverzeichnis_festlegen" erneut aufgerufen.
 +
else
 +
Gibt es das Verzeichnis noch nicht
 +
kdialog --passivepopup "Die Verzeichnisstruktur wird in folgendem Arbeitsverzeichnis erstellt: ${basisverzeichnis}"
 +
echo ${basisverzeichnis} > ~/.dvb_wiki_script_arbeitsverzeichnis.txt
 +
wird angezeigt, wo das Basisverzeichnis angelegt wird. Anschließend wird der Inhalt der Variable "basisverzeichnis", also der Pfad zum Basisverzeichnis in die versteckte Textdatei geschrieben.
 +
kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
 +
exit
 +
Wurde in der Eingabebox auf Abbrechen gedrückt, wird das Script nach einem Hinweis beendet.
  
*'''$maxgroesse''': Diese Variable enthält die Anzahl der Bytes, die maximal auf eine DVD passen. Ist der Film größer, wird requantisiert.
+
===<font color="olive"> arbeitsverzeichnisse_erstellen () </font>===
 +
basisverzeichnis=`cat ~/.dvb_wiki_script_arbeitsverzeichnis.txt`
 +
Der Pfad zum Basisverzeichnis wird aus der versteckten Testdatei gelesen und in die Variable "basisverzeichnis" geschrieben.
 +
if [ ! -e ${basisverzeichnis} ] ; then mkdir ${basisverzeichnis} ; fi
 +
Nun wird das Basisverzeichnis mit mkdir angelegt. Die if-Abrage dient nur zur Vermeidung von Fehlermeldungen, die auftreten würden, wenn das anzulegende Verzeichnis schon existiert, was ja ab dem zweiten Scriptlauf der Fall ist.
  
*'''$brenngeschwindigkeit''': In dieser Variablen steht die maximale Geschwindigkeit, mit der die DVD vom growisofs gebrannt wird.
+
Anschließend werden die einzelnen Arbeitsverzeichnisse angelegt:
 
 
*'''$suchpfade''': In den hier enthaltenen Pfaden wird während der Installationsroutine nach den Helferprogrammen gesucht.
 
 
 
==<font color="green"> Fehlermeldungen abschalten </font>==
 
 
 
*'''exec 2>/dev/null''': Damit werden Meldungen auf dem Standard-Fehlerkanal ins Nirwana geschickt (Für Inbetriebnahme und Fehlersuche evt. auskommentieren).
 
 
 
Das Script ist so programmiert, daß Betriebs- und Fortschrittsmeldungen der einzelnen Funktionen in einem Konsolenfenster auf dem Bildschirm erscheinen (echo "...").
 
Die Fehlermeldungen wurden mit obigem Befehl bewußt ausgeklammert, da die Ausgaben im Betrieb sonst schnell unübersichtlich werden.
 
 
 
Es gibt einige Programme, die auch Betriebsmeldungen über den Standard-Fehlerkanal senden. Um diese Meldungen trotzdem auf dem Bildschirm zu sehen, wurde für
 
diese Programme der Fehlerkanal auf die Standardausgabe umgeleitet. Das erfolgt durch Anhängen von '''2>&1''' ans Ende des jeweiligen Programmaufrufs.
 
 
 
==<font color="green"> Installationsroutine </font>==
 
 
 
===<font color="olive"> Programmnamen </font>===
 
 
 
Dies sind die Namen der Helferprogramme, die in einer indizierten Variablen abgelegt werden.
 
 
 
===<font color="olive"> Anlegen der notwendigen Verzeichnisse </font>===
 
 
 
Das Basisverzeichnis wird angelegt. Und im Basiverzeichnis werden folgende Arbeitsordner angelegt:
 
 
*'''dvd_aufnahme''': Hier wird zuerst nach den zu bearbeitenden Filmen gesucht.
 
*'''dvd_aufnahme''': Hier wird zuerst nach den zu bearbeitenden Filmen gesucht.
*'''dvd_tmp''': Hier legen die Helferprogramme Zwischenergebnisse ab ab und suchen nach den Ergebnissen anderen Helferprogramme
+
*'''dvd_tmp''': Hier legen die Helferprogramme Zwischenergebnisse ab und suchen nach den Ergebnissen anderen Helferprogramme
 
*'''dvd_struktur''': In diesem Ordner wird die fertige DVD-Struktur zwischengespeichert.
 
*'''dvd_struktur''': In diesem Ordner wird die fertige DVD-Struktur zwischengespeichert.
 
*'''dvd-sicherung''': Hierhin werden fertige Arbeitsergebnisse gesichert, wenn das vom User so gewünscht wird.
 
*'''dvd-sicherung''': Hierhin werden fertige Arbeitsergebnisse gesichert, wenn das vom User so gewünscht wird.
 
*'''default''': Hier stehen die Pfadnamen der Helferprogramme und die Initialisierungsdateien für ProjectX.
 
*'''default''': Hier stehen die Pfadnamen der Helferprogramme und die Initialisierungsdateien für ProjectX.
*'''screenshot''': Mit mplayer erstellte Screenshots der Filme / Clips, die ich dann zum Bedrucken der DVD verwende.
+
*'''screenshot''': Mit kaffeine erstellte Screenshots der Filme / Clips, die ich dann zum Bedrucken der DVD verwende.
  
===<font color="olive"> Programmerkennung </font>===
+
===<font color="olive"> programmerkennung () </font>===
  
 
In dieser Routine wird nachgesehen, ob die notwendigen Helferprogramme installiert sind. Und das funktioniert so:
 
In dieser Routine wird nachgesehen, ob die notwendigen Helferprogramme installiert sind. Und das funktioniert so:
Zeile 95: Zeile 94:
 
====Was wird damit gemacht?====
 
====Was wird damit gemacht?====
 
  case "$pfadanzahl" in
 
  case "$pfadanzahl" in
In Abhängigkeit der Anzahl der gefundenen Pfade passier folgendes:
+
In Abhängigkeit der Anzahl der gefundenen Pfade passiert folgendes:
  
 
*'''0)''': Anzahl 0, das Programm wurde nicht gefunden.
 
*'''0)''': Anzahl 0, das Programm wurde nicht gefunden.
Nach einem Hinweis wird das Script beendet . Das Hfehlende Helferprogramm muß installiert werden..
+
Nach einem Hinweis wird das Script beendet . Das fehlende Helferprogramm muß installiert werden..
 
*'''1)''': Anzahl 1, das Programm existiert genau einmal.
 
*'''1)''': Anzahl 1, das Programm existiert genau einmal.
 
Der dazugehörige Pfad wird in das Default-Verzeichnis geschrieben.
 
Der dazugehörige Pfad wird in das Default-Verzeichnis geschrieben.
Zeile 104: Zeile 103:
 
Es wird nachgefragt (kdialog --combobox), welcher der Pfade verwendet werden soll. Dieser Pfad wird dann ins Default-Verzeichnis geschrieben.
 
Es wird nachgefragt (kdialog --combobox), welcher der Pfade verwendet werden soll. Dieser Pfad wird dann ins Default-Verzeichnis geschrieben.
  
Nachdem diese Routine neunmal erfolgreich durchlaufen ist, kann mit der eigentlichen Videobearbeitung begonnen werden.
+
Nachdem diese Routine neunmal erfolgreich durchlaufen ist, ist die Funktion beendet und es geht mit der im Hauptprogramm folgenden Funktion weiter
  
==<font color="green"> Variablenzuweisungen </font>==
+
===<font color="olive"> variablenzuweisungen () </font>===
Diese Zuweisungen haben den Sinn, das Script besser lesbar zu machen. Im Script selbst wird dann ausschließlich mit diesen Variablen gearbeitet bzw. mit  
+
Diese Zuweisungen haben den Sinn, das Script besser lesbar zu machen. Im Script selbst wird dann zum größten Teil mit diesen Variablen gearbeitet bzw. mit  
 
in Variablen gespeicherten Pfaden. Durch diese Strategie kann das Script einfach an neue Gegebenheiten anpepasst werden. Es muß nicht lange im Code gesucht werden,
 
in Variablen gespeicherten Pfaden. Durch diese Strategie kann das Script einfach an neue Gegebenheiten anpepasst werden. Es muß nicht lange im Code gesucht werden,
 
an welchen Stellen was geändert werden muß. Es braucht nur der Inhalt der entsprechenden Variablen ausgetauscht werden.
 
an welchen Stellen was geändert werden muß. Es braucht nur der Inhalt der entsprechenden Variablen ausgetauscht werden.
  
==<font color="green"> Konfiguration PJX </font>==
+
===<font color="olive"> konfiguration () </font>===
 
 
Hier werden die Initialisierungsdateien festgelegt, in denen Einstellungen stehen, mit denen ProjectX startet:
 
  
===X.ini für Filmbearbeitung===
+
====X.ini für Filmbearbeitung====
  
 
Die X.ini.film enthält folgende Einstellungen:
 
Die X.ini.film enthält folgende Einstellungen:
Zeile 128: Zeile 125:
 
*'''OptionPanel.CloseOnEnd=1''': Nachdem PJX fertig ist, beendet es sich selber
 
*'''OptionPanel.CloseOnEnd=1''': Nachdem PJX fertig ist, beendet es sich selber
  
===X.ini für Videoclips===
+
Die X.ini wird im Default-Verzeichnis abgelegt, von wo sie bei Bedarf von ProjectX geladen wird.
 +
 
 +
Werden im PJX-Fenster irgendwelche Einstellungen verändert, so werden diese Änderungen nicht in die X.ini übernommen. Das wurde absichtlich
 +
so programmiert, damit man immer einen definierten Ausgangszustand hat.<br>
 +
Wird hier eine Speicherung gewünscht, kann dies durch einen zusätzlichen Eintrag in die X.ini erfolgen. Dann steht man allerdings vor dem Problem, oft
 +
nicht zu wissen, mit welchen Einstellungen PJX denn nun tatsächlich startet. Da es mir immer wieder so ging, kann ich nur raten, die Speicherung ausgeschalten
 +
zu lassen.
  
Die X.ini.clip enthält zusäthlich:
+
====Voreinstellungen====
 +
Hier werden Variablen mit Voreinstellungen belegt, die bei Bedarf geändert werden können (aber nur, wenn man weiß, wie die Auswirkungen sind).
  
*'''AudioPanel.decodeMPGAudio=1''': Die mpeg-audio-Dateien werden zu .wav decodiert (Für's spätere Normalisieren des Tons notwendig)
+
==<font color="green"> Löschfunktionen </font>
  
Diese beiden X.ini's werden im Default-Verzeichnis abgelegt, von wo sie bei Bedarf geladen werden.
+
===<font color="olive"> loeschen_temporaere_arbeitsordner () </font>===
  
Werden im PJX-Fenster irgendwelche Einstellungen verändert, so werden diese Änderungen nicht in die jeweilige X.ini übernommen. Das wurde absichtlich
+
*'''rm''': Die Inhalte der Ordners ${basisverzeichnis}/dvd_tmp und ${basisverzeichnis}/dvd_tmp1 werden gelöscht.
so programmiert, damit man immer einen definierten Ausgangszustand hat.<br>
+
*'''rm -r''': Der Ordner ${basisverzeichnis}/dvd_struktur enthält Verzeichnisse, die wiederum Dateien enthalten und muß des halb rekursiv gelöscht werden.
Wird hier eine Speicherung gewünscht, kann dies durch einen zusätzlichen Eintrag in die X.ini's erfolgen. Dann steht man allerdings vor dem Problem, oft
 
nicht zu wissen, mit welchen Einstellungen PJX denn nun tatsächlich startet. Da es mir immer wieder so ging, kann ich nur raten, die Speicherung ausgeschalten
 
zu lassen.
 
  
==<font color="green"> Funktionen </font>==
+
==<font color="green"> Aufgabenmenues </font>==
  
Diese Funktionen werden vom Hauptprogrmm nach Bedarf aufgerufen und bilden das eigentliche Gerüst des Scriptes. Wird von einer Funktion erwartet, daß sie einen
+
===<font color="olive"> hauptmenue </font>()===
Wert an das Hauptprogramm übergeben soll, dann wird das durch den Befehl "echo Variable" am Ende der Funktion realisiert.
+
auswahl_hauptmenue=`kdialog --caption "Hauptmenue" --geometry 200x250+500+400 --radiolist "Bitte einen Aufgabenbereich wählen" \
 +
*'''kdialog''': Das KDE-Dialog-Programm
 +
*'''--caption "Hauptmenue"''': öffnet ein Fenster, das den Namen "Hauptmenue" trägt
 +
*'''--geometry 200x250+500+400''': und diese Größe und Position hat
 +
*'''--radiolist''' als Liste mit Radio-Buttons
 +
*'''"Bitte einen Aufgabenbereich wählen"''': Das wird gefragt.
 +
*'''auswahl_hauptmenue`...`''': In diese Variable wird die Nummer der Antwort geschrieben.
  
===<font color="olive"> del_ordner () </font>===
+
Diese Nummer wird dann später vom Hauptprogramm ausgewertet.
 +
if [ $? != 0 ]
 +
then
 +
kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
 +
exit
 +
fi
 +
Wenn im Auswahlfenster auf Abbrechen gedrückt wird, dann wird das Script beendet.
  
*'''rm''': Die Inhalte des Ordners $tmp_pfad werden gelöscht. Ebenso die Inhalte der im dvd_strukturpfad enthaltenen Ordner AUDIO_TS und VIDEO_TS.
+
===<font color="olive"> untermenue_video_dvd () </font>()===
*'''rmdir''': Die Ordner AUDIO_TS und VIDEO_TS selbst werden gelöscht
+
Diese Funktion arbeitet analog zum Hauptmenue mit dem Untrscheid, daß die Antwortnummer in die Variable was_tun gespeichert wird.
  
Damit ist ein definierter Ausgangszustand hergestellt.
+
===<font color="olive"> untermenue_ts () </font>()===
 +
Siehe Funktion untermenue_video_dvd ()
  
===<font color="olive"> fehler () </font>===
+
===<font color="olive"> untermenue_videoclip () () </font>()===
if [ ! -e ${tmp_pfad}/film.mpg ]
+
Siehe Funktion untermenue_video_dvd ()
Wenn keine Datei film.mpg im Ordner ${tmp_pfad} existiert, wurde auch nichts multiplext. Es muß also irgendwo ein Fehler passiert sein.
 
  
nach einem Hinweis auf diesen Fehler (mit kdialog) wird das Script beendet.
+
==<font color="green"> Auswahl der Eingangsdateien </font>==
  
===<font color="olive"> aktionenauswahl </font>()===
+
===<font color="olive"> filmauswahl_dvd () </font>===
was_tun=`kdialog --caption "Videobearbeitung" --geometry 500x300-0+0 --radiolist "Was soll also getan werden?"
+
Die Variable brenn_pfad wird mit dem Inhalt der Variablen ${dvdstruktur_pfad} belegt. Danach wird die Funktion filmauswahl () aufgerufen.
*'''kdialog''': Das KDE-Dialog-Programm
 
*'''--caption "Videobearbeitung"''': öffnet ein Fenster, das den Namen "Videobearbeitung" trägt
 
*'''--geometry 500x300-0+0''': und diese Größe und Position hat
 
*'''--radiolist''' als Liste mit Radio-Buttons
 
*'''"Was soll also getan werden?"''': Das wird gefragt.
 
*'''was_tun=`...`''': In diese Variable wird die Nummer der Antwort geschrieben.
 
  
Diese Nummer wird dann später vom Hauptprogramm ausgewertet werden.
+
===<font color="olive"> filmauswahl_ts () </font>===
 +
Die Variable brenn_pfad wird mit dem Inhalt der Variablen ${tmp_pfad} belegt. Danach wird die Funktion filmauswahl () aufgerufen.
  
 
===<font color="olive"> filmauswahl () </font>===
 
===<font color="olive"> filmauswahl () </font>===
  quelldatei=`kdialog --caption "Filmauswahl" --geometry 500x500-0+0 --getopenfilename ${aufnahme_pfad}`
+
  quelldatei=`kdialog --caption "Filmauswahl" --geometry 600x500-0+0 --getopenfilename ${aufnahme_pfad}`
 
*'''kdialog''': Das KDE-Dialog-Programm
 
*'''kdialog''': Das KDE-Dialog-Programm
 
*'''--caption "Filmauswahl"''': öffnet ein Fenster, das den Namen "Filmauswahl" trägt
 
*'''--caption "Filmauswahl"''': öffnet ein Fenster, das den Namen "Filmauswahl" trägt
*'''--geometry 500x300-0+0''': und diese Größe und Position hat
+
*'''--geometry 600x500-0+0''': und diese Größe und Position hat
 
*'''--getopenfilename''': Es wird ein KDE-Fenster geöffnet, in dem aus einer Liste von Dateien ausgewählt werden kann
 
*'''--getopenfilename''': Es wird ein KDE-Fenster geöffnet, in dem aus einer Liste von Dateien ausgewählt werden kann
 
*'''${aufnahme_pfad}''': Es werden die Dateien in diesem Pfad zur Auswahl angeboten.  
 
*'''${aufnahme_pfad}''': Es werden die Dateien in diesem Pfad zur Auswahl angeboten.  
 
*'''quelldatei=`...`''': Die ausgewählte Datei wird in die Variable $quelldatei geschrieben.
 
*'''quelldatei=`...`''': Die ausgewählte Datei wird in die Variable $quelldatei geschrieben.
if [ $? != 0 ]
+
 
then
+
===<font color="olive"> verzeichnisauswahl_dvd () </font>===
exit
+
Die Variable $verzeichnistyp wird mit dem String *_dvd belegt. Dieser String wird zur Dateisuche mit find in der nun aufgerufenen Funktion verzeichnisauswahl () benötigt.
Wenn im Dialogfenster auf den Button Abbrechen gedrückt wurde, wird das Script beendet.
+
 
 +
===<font color="olive"> verzeichnisauswahl_ts () </font>===
 +
Die Variable $verzeichnistyp wird mit dem String *_ts belegt. Dieser String wird zur Dateisuche mit find in der nun aufgerufenen Funktion verzeichnisauswahl () benötigt.
  
 
===<font color="olive"> verzeichnisauswahl() </font>===
 
===<font color="olive"> verzeichnisauswahl() </font>===
  verzeichnis=`kdialog --caption "Verzeichnisauswahl" --geometry 500x500-0+0 --getexistingdirectory ${sicherungs_pfad}`
+
  anzahl_der_sicherungen=`find $sicherungs_pfad/$verzeichnistyp -maxdepth 0 -type d | wc -l`
*'''kdialog''': Das KDE-Dialog-Programm
+
Die Anzahl der gesicherten Arbeitsergebnisse (*_dvd oder *_ts) wird ermittelt und zwischengespeichert.
*'''--caption "Verzeichnisauswahl"''': öffnet ein Fenster, das den Namen "Verzeichnisauswahl" trägt
+
hilfsverzeichnis=`find $sicherungs_pfad/$verzeichnistyp -maxdepth 0 -type d`
*'''--geometry 500x500-0+0''': und diese Größe und Position hat
+
Die Namen der gesicherten Arbeitsergebnisse (*_dvd oder *_ts) wird ermittelt und zwischengespeichert.
*'''--getexistingdirectory''': Es wird ein KDE-Fenster geöffnet, in dem aus einer Liste von Verzeichnissen ausgewählt werden kann
+
case $anzahl_der_sicherungen in
*'''${sicherungs_pfad}''': Es werden die Verzeichnisse in diesem Pfad zur Auswahl angeboten.  
+
In Abhängigkeit der Anzahl der gesicherten Arbeitsverzeichnisse ergeben sich folgende Möglichkeiten:
*'''verzeichnis=`...`''': Die ausgewählte Datei wird in die Variable $verzeichnis geschrieben.
+
*Anzahl 0: Das Script wird nach einem Hinweis beendet, da keine passene Sicherung zum Brennen gefunden wurde
if [ $? != 0 ]
+
*Anzahl 1: Die gefundene Sicherung wird zur Weiterverarbeitung in die Variable $verzeichnis geschrieben.
then
+
*Anzahl *: Die gewünschte Sicherung wird mit kdialog ausgewählt und zur Weiterverarbeitung in die Variable $verzeichnis geschrieben und in die Variable $brenn_pfad kopiert.
exit
+
 
Wenn im Dialogfenster auf den Button Abbrechen gedrückt wurde, wird das Script beendet.
+
==<font color="green"> Eingangsverarbeitung </font>==
  
 
===<font color="olive"> pjx_demux_gui () </font>===
 
===<font color="olive"> pjx_demux_gui () </font>===
Zeile 221: Zeile 231:
 
*'''$quelldatei''':Dieser Stream wird verarbeitet
 
*'''$quelldatei''':Dieser Stream wird verarbeitet
 
*'''1>/dev/null''': Alles, was ich an Ausgeben auf dem Bildschirm nicht sehen will, wird ins Leere geschickt.
 
*'''1>/dev/null''': Alles, was ich an Ausgeben auf dem Bildschirm nicht sehen will, wird ins Leere geschickt.
 
===<font color="olive"> pjx_clip () </font>===
 
java -jar ${pjx} -demux -gui  -ini ${default_pfad}/X.ini.clip -out ${tmp_pfad} -name film "$quelldatei" 1>/dev/null
 
*'''-ini ${default_pfad]/X.ini.clip''': mit dieser Initialisierungsdatei wird PJX gestartet. In ihr festgelegt wird, daß das mpg-audio zu einer wav-Datei decodiert wird.
 
Alle anderen Optionen wie bei "pjx_demux_gui ()"
 
  
 
===<font color="olive"> mpeg1_input () </font>===
 
===<font color="olive"> mpeg1_input () </font>===
  ${ffmpeg} -i "${quelldatei}" ${tmp_pfad}/film.mp2.wav -vcodec copy ${tmp_pfad}/film.m1v
+
  ${ffmpeg} -i "${quelldatei}" -acodec copy ${tmp_pfad}/film.mp2 -vcodec copy ${tmp_pfad}/film.m1v
 
*'''${ffmpeg}''': Aufruf von ffmpeg (z.B.: /usr/bin/ffmpeg),
 
*'''${ffmpeg}''': Aufruf von ffmpeg (z.B.: /usr/bin/ffmpeg),
*'''-i ${quelldatei}''': um diesen Video-Clip zu verarbeiten
+
*'''-i ${quelldatei}''': um diesen Video-Clip zu demultiplexen
*'''${tmp_pfad}/film.mp2.wav''': Der Ton des Clips wird decodiert zu einem wav-file.
+
 
*'''-vcodec copy''': Das Videofile wird nicht verändert, sondern nur demultiplext
+
==<font color="green"> Bearbeitung </font>==
*'''${tmp_pfad}/film.m1v''': und ist dann hier zu finden
 
  
 
===<font color="olive"> requantisieren () </font>===
 
===<font color="olive"> requantisieren () </font>===
Zeile 319: Zeile 323:
 
'''Ein PCM-Signal auf einen definierten Lautstärkepegel zu bringen, ohne die Dynamik selbst zu verändern, wird "normalisieren" genannt.'''
 
'''Ein PCM-Signal auf einen definierten Lautstärkepegel zu bringen, ohne die Dynamik selbst zu verändern, wird "normalisieren" genannt.'''
  
Mit dem in dieser Funktion verwendeten Befehl "normalize" wird die lauteste Stelle in dem Audio-File "film.mp2.wav" auf -12dBfs (also 12dB unter "full scale") gebracht. Der Rest wird entsprechend
+
Mit dem in dieser Funktion verwendeten Befehl "normalize" wird die lauteste Stelle in dem Audio-File "film.mp2.wav" auf -12dBfs (also 12dB unter "full scale") gebracht. Der Rest wird entsprechend mitgezogen. Aber, wie gesagt, ohne Verlust an Dynamik.
mitgezogen. Aber, wie gesagt, ohne Verlust an Dynamik.
 
 
 
${normalize} -v ${tmp_pfad}/film.mp2.wav
 
*'''${normalize}''': Aufruf des Befehls normalize (z.B.: /usr/bin/normalize)
 
*'''-v''': Bearbeitungsfortschritt anzeigen
 
*'''{tmp_pfad}/film.mp2.wav''': Diese Audio-Datei wird normalisiert und dabei durch das Bearbeitungsergebnis ersetzt
 
  
 
Das Normalisieren funktioniert nur mit PCM-Files. eine komprimierte Datei (mp2) muß erst zu PCM (wav) decodiert werden.
 
Das Normalisieren funktioniert nur mit PCM-Files. eine komprimierte Datei (mp2) muß erst zu PCM (wav) decodiert werden.
Zeile 333: Zeile 331:
 
und regelt entsprechend die Lautstärke beim Abspielen des Files. Die Voraussetzung ist hier sebstverständlich ein Player, der dies Auswertung auch verarbeiten
 
und regelt entsprechend die Lautstärke beim Abspielen des Files. Die Voraussetzung ist hier sebstverständlich ein Player, der dies Auswertung auch verarbeiten
 
kann.
 
kann.
Dies nur zur Information, daß es noch eine Welt ausßerhalb von mp2 gibt.
+
Dies nur zur Information, daß es noch eine Welt ausßerhalb von mp2 gibt. Ne, noch etwas gibts und das heißt AC3, zu Deutsch "Dolby digital"
 +
 
 +
====Ton-Dateien vorbereiten====
 +
mv ${basisverzeichnis}/dvd_tmp/film.mp2 ${basisverzeichnis}/dvd_tmp1
 +
rm ${basisverzeichnis}/dvd_tmp/*.mp2
 +
Es gibt Fernsehsender, die mehr als eine mp2-Tondatei senden, zum Beispiel einen zusätzlich zum normalen Stereoton einen Zweikanalton. Wir wollen uns beim normalisieren ausschließlich auf den Stereoton beschränken. Deshalb werden alle anderen mp2-Dateien gelöscht.
  
Da der Ton von Fersehprogrammen aber im mp2 Verfahren codiert ist (AC3 lassen wir hier einmal außen vor), müssen wir den ober beschriebenen verlustbehafteten
+
====mp2 decodieren====
Weg mit normalize gehen. Aber keine Angst, die Verluste sind nicht so groß, daß sie stören würden. Der mit einem normal arbeitenden Gehör ausgestattete
+
${ffmpeg} -i ${basisverzeichnis}/dvd_tmp1/film.mp2 ${basisverzeichnis}/dvd_tmp1/film.mp2.wav
Mitteleuropäer wird zufrieden sein mit der Qualität des Bearbeitungsergebnisses.
+
Aus dem mp2-File wird mit Hilfe von ffmpeg ein wav-File gemacht.
  
===<font color="olive"> encode2mp2 () </font>===
+
====normalisieren====
Aus einer wav Datei wird ein mp2-file gemacht.
+
${normalize} -v ${basisverzeichnis}/dvd_tmp1/film.mp2.wav
  ${ffmpeg} -i ${tmp_pfad}/film.mp2.wav -acodec mp2 -ab 192k ${tmp_pfad}/film.mp2
+
Das wav-File wird normalisiert. Es überschreibt sich dabei selbst mit dem Ergebnis.
 +
 
 +
====encodieren zu mp2====
 +
  ${ffmpeg} -i ${basisverzeichnis}/dvd_tmp1/film.mp2.wav -acodec mp2 -ab 192k ${tmp_pfad}/film.mp2
 +
Aus einer wav -Datei wird wieder ein mp2-File gemacht.
 
*'''${ffmpeg}''': Aufruf von ffmpeg (z.B.: /usr/bin/ffmpeg)
 
*'''${ffmpeg}''': Aufruf von ffmpeg (z.B.: /usr/bin/ffmpeg)
*'''-i ${tmp_pfad}/film.mp2.wav''': Dieses PCM-file
+
*'''-i ${tmp_pfad1}/film.mp2.wav''': Dieses PCM-file
 
*'''-acodec mp2''': wird zu einem mp2-File encodiert,
 
*'''-acodec mp2''': wird zu einem mp2-File encodiert,
 
*'''-ab 192k''': welches eine Audio-bitrate von 192k erhält (mp2-Standard)
 
*'''-ab 192k''': welches eine Audio-bitrate von 192k erhält (mp2-Standard)
 
*'''${tmp_pfad}/film.mp2''': Das Ergebnis findet man dann hier
 
*'''${tmp_pfad}/film.mp2''': Das Ergebnis findet man dann hier
 +
 +
===<font color="olive"> ac3_behalten () </font>===
 +
Es weden ausschließlich AC3-Tondateien zur Weiterverarbeitung bereitgestellt. Alles andere, was "Ton" heißt, wird gelöscht
 +
 +
===<font color="olive"> mp2_behalten () </font>===
 +
Es weden ausschließlich mp2-Tondateien zur Weiterverarbeitung bereitgestellt. Alles andere, was "Ton" heißt, wird gelöscht
  
 
===<font color="olive"> multiplexen () </font>===
 
===<font color="olive"> multiplexen () </font>===
Zeile 376: Zeile 389:
 
*'''-o ${dvdstruktur_pfad}''': In diesem Ordner: ${dvdstruktur_pfad}/VIDEO_TS  
 
*'''-o ${dvdstruktur_pfad}''': In diesem Ordner: ${dvdstruktur_pfad}/VIDEO_TS  
 
*'''-T''': werden noch folgende Dateien erzeugt: VIDEO_TS.BUP und VIDEO_TS.IFO
 
*'''-T''': werden noch folgende Dateien erzeugt: VIDEO_TS.BUP und VIDEO_TS.IFO
 +
 +
==<font color="green"> Ergebniskontrolle </font>==
 +
 +
===<font color="olive"> abspielen () </font>===
 +
$kaffeine -nofork --geometry 600x500-0+0 ${brenn_pfad}
 +
*'''$kaffeine''': Der Videoplayer wird gestartet,
 +
*'''--nofork''': läuft im Vordergrund
 +
*'''${brenn_pfad}''': und spielt die hier enthaltene Datei ab
 +
 +
==<font color="green"> Brennen </font>==
  
 
===<font color="olive"> brennen_video_dvd () </font>===
 
===<font color="olive"> brennen_video_dvd () </font>===
 
Mit dieser Funktion wird die fertige DVD-Struktur auf DVD kopiert. Das Ergebnis ist eine Video-DVD
 
Mit dieser Funktion wird die fertige DVD-Struktur auf DVD kopiert. Das Ergebnis ist eine Video-DVD
  ${growisofs} -speed=${brenngeschwindigkeit} -dvd-compat -Z /dev/dvd -dvd-video ${brenn_pfad} 2>&1
+
  ${growisofs} -speed=${brenngeschwindigkeit} -dvd-compat -Z /dev/dvd -dvd-video ${brenn_pfad}
 
*'''${growisofs}''': Programmaufruf von growisofs (z.B. /usr/bin/growisofs)
 
*'''${growisofs}''': Programmaufruf von growisofs (z.B. /usr/bin/growisofs)
 
*'''-speed=${brenngeschwindigkeit}''': maximale Brenngeschwindigkeit
 
*'''-speed=${brenngeschwindigkeit}''': maximale Brenngeschwindigkeit
Zeile 398: Zeile 421:
 
  kdialog --msgbox "Bitte DVD Nr.: $i einlegen"
 
  kdialog --msgbox "Bitte DVD Nr.: $i einlegen"
 
Aufforderung , eine neue DVD bzw. die nächste DVD zum Brennen einzulegen
 
Aufforderung , eine neue DVD bzw. die nächste DVD zum Brennen einzulegen
  ${growisofs} -speed=${brenngeschwindigkeit} -Z /dev/dvd  -allow-limited-size -R -J ${brenn_pfad}/"film($((i-1)))"* 2>&1
+
  ${growisofs} -speed=${brenngeschwindigkeit} -Z /dev/dvd  -allow-limited-size -R -J ${brenn_pfad}/"film($((i-1)))"*
 
*'''${growisofs}''': Programmaufruf für growisofs (z.B. /usr/bin/growisofs)
 
*'''${growisofs}''': Programmaufruf für growisofs (z.B. /usr/bin/growisofs)
 
*'''-speed=${brenngeschwindigkeit}''': maximale Brenngeschwindigkeit
 
*'''-speed=${brenngeschwindigkeit}''': maximale Brenngeschwindigkeit
Zeile 407: Zeile 430:
 
*'''${brenn_pfad}/"film($((i-1)))''': Diese Datei auf DVD brennen
 
*'''${brenn_pfad}/"film($((i-1)))''': Diese Datei auf DVD brennen
  
===<font color="olive"> sichern_struktur () </font>===
+
==<font color="green"> Sichern </font>==
 +
 
 +
===<font color="olive"> sichern_dvd_struktur () </font>===
 
Diese Funktion sichert die DVD-Struktur
 
Diese Funktion sichert die DVD-Struktur
  sicherungsordner=$(date +%Y%m%d%H%M%S)
+
  sicherungsordner=$(date +%Y%m%d%H%M%S)_dvd
 
In diesen Sicherungsordner wird die DVD-Struktur geschrieben. Der Name des Ordner wird aus dem aktuellen Datum und der momentanen Uhrzeit generiert.
 
In diesen Sicherungsordner wird die DVD-Struktur geschrieben. Der Name des Ordner wird aus dem aktuellen Datum und der momentanen Uhrzeit generiert.
 
  mkdir ${sicherungs_pfad}/${sicherungsordner}
 
  mkdir ${sicherungs_pfad}/${sicherungsordner}
Zeile 418: Zeile 443:
 
===<font color="olive"> sichern_ts () </font>===
 
===<font color="olive"> sichern_ts () </font>===
 
Diese Funktion sichert die TS-files
 
Diese Funktion sichert die TS-files
  sicherungsordner=$(date +%Y%m%d%H%M%S)
+
  sicherungsordner=$(date +%Y%m%d%H%M%S)_ts
 
In diesen Sicherungsordner wird die DVD-Struktur geschrieben. Der Name des Ordner wird aus dem aktuellen Datum und der momentanen Uhrzeit generiert.
 
In diesen Sicherungsordner wird die DVD-Struktur geschrieben. Der Name des Ordner wird aus dem aktuellen Datum und der momentanen Uhrzeit generiert.
 
  mkdir ${sicherungs_pfad}/${sicherungsordner}
 
  mkdir ${sicherungs_pfad}/${sicherungsordner}
Zeile 425: Zeile 450:
 
mv verschiebt die TS-files in den Sicherungsordner
 
mv verschiebt die TS-files in den Sicherungsordner
  
===<font color="olive"> clip_speichern () </font>===
+
===<font color="olive"> sichern_clip () </font>===
 
Diese Funktion speichert einen Videoclip
 
Diese Funktion speichert einen Videoclip
  clipspeicher=`kdialog --title "$quelldatei" --getsavefilename /Videoclips/Archiv`
+
  clipspeicher=`kdialog --title "$quelldatei" --getsavefilename ${clip_pfad}`
 
*'''kdialog''': Programmaufruf für kdialog (z.B. /usr/bin/kdialog)
 
*'''kdialog''': Programmaufruf für kdialog (z.B. /usr/bin/kdialog)
 
*'''--title "$quelldatei"''': Überschrift für das KDE-Fenster
 
*'''--title "$quelldatei"''': Überschrift für das KDE-Fenster
 
*'''--getsavefilename''': Generiert ein KDE-Fenster, in dem ein Zielverzeichnis zum Speichern ausgewählt werden kann. Auch der Name, den der zu speichernde Clip bekommen soll, wird angegeben.
 
*'''--getsavefilename''': Generiert ein KDE-Fenster, in dem ein Zielverzeichnis zum Speichern ausgewählt werden kann. Auch der Name, den der zu speichernde Clip bekommen soll, wird angegeben.
*'''/Videoclips/Archiv''': In dieses Verzeichnis wird bevorzugt gespeichert
+
*'''${clip_pfad}''': In dieses Verzeichnis wird bevorzugt gespeichert
 
*'''clipspeicher=`....`''': Der gewählte Name und Speicherpfad steht dann in dieser Variable zur Verfügung
 
*'''clipspeicher=`....`''': Der gewählte Name und Speicherpfad steht dann in dieser Variable zur Verfügung
 
  mv ${tmp_pfad}/film.mpg ${clipspeicher}
 
  mv ${tmp_pfad}/film.mpg ${clipspeicher}
 
Der Clip wird an den vorhin ausgewählten Ort gespeichert
 
Der Clip wird an den vorhin ausgewählten Ort gespeichert
  
===<font color="olive"> abspielen () </font>===
+
=Hauptprogramm=
cd ${screenshot_pfad}
 
Macht den Screenshot-Pfad zum aktuellen Verzeichnis
 
${mplayer} -vf screenshot -geometry 100%:0% dvd://1 -dvd-device ${brenn_pfad} 1>/dev/null
 
*'''${mplayer}''': Aufruf von mplayer (z.B.: /usr/bin/mplayer)
 
*'''-vf screenshot''': Lädt das Viedofilter "screenshot" Damit lassen sich über eine bestimmte Tastenkombination Screenshots des abgespielten Films im aktuellem Verzeichnis ablegen.
 
*'''-geometry 100%:0%''': An dieser Stelle wird das Fenster von mplayer angezeigt
 
*'''dvd://1''': Eine DVD wird abgespielt, wobei sich die abzuspielenden Dateien
 
*'''-dvd-device ${brenn_pfad}''': in diesem Pfad befinden
 
 
 
==<font color="green"> Hauptprogramm </font>==
 
Mit dem Scriptstart startet dieses Hauptprogramm. Von ihm werden alle Funktionen je nach Bedarf aufgerufen.
 
 
 
*'''del_ordner''': Die Funktion zum Löschen der Arbeitsordner wird aufgerufen.
 
*'''was_tun=`aktionenauswahl`''': Über die Funktion "aktionenauswahl" wird das gewünschte Szenario ausgewählt. Die dazugehörige Nummer wird in die Variable $was_tun geschrieben.
 
*'''case $was_tun in''': Im gerade ausgewählten Szenario werden nun die einzelnen Programmschritte (Funktionen) aufgerufen
 
 
 
==<font color="green"> Szenario 1 </font>==
 
 
 
===<font color="olive"> brenn_pfad=${dvdstruktur_pfad} </font>===
 
Damit kann später das, was im DVD-Strukturpfad steht, gebrannt werden
 
 
 
===<font color="olive"> filmauswahl </font>===
 
*'''Aktion''': Auswahl des zu bearbeitendes Films
 
*'''Input''': Über KDE-Fenster ausgewählte Eingangsdatei
 
*'''Output''': $quelldatei
 
 
 
===<font color="olive"> pjx_demux_gui </font>===
 
*'''Aktion''': Aufruf des Programms ProjectX zum Schneiden und Demultiplexen
 
*'''Input''': $quelldatei
 
*'''Output''': $dvd_tmp/film.m2v und/oder $dvd_tmp/*.mp2 und/oder $dvd_tmp/*.ac3
 
 
 
===<font color="olive"> requantisieren </font>===
 
*'''Aktion''': Requantisieren der Videodatei, wenn es notwendig sein sollte
 
*'''Input''': $dvd_tmp/film.m2v und/oder $dvd_tmp/*.mp2 und/oder $dvd_tmp/*.ac3, $maxgroesse
 
*'''Output''': ${tmp_pfad}/film.m2v
 
 
 
===<font color="olive"> multiplexen </font>===
 
*'''Aktion''': Multiplexen der seperaten Audio- und Videofiles
 
*'''Input''': $dvd_tmp/film.m2v und/oder $dvd_tmp/*.mp2 und/oder $dvd_tmp/*.ac3
 
*'''Output''': ${tmp_pfad}/film.mpg
 
 
 
===<font color="olive"> fehler </font>===
 
*'''Aktion''': Programmabbruch, wenn nicht multiplext werden konnte
 
*'''Input''':${tmp_pfad}/film.mpg
 
*'''Output''': exit
 
 
 
===<font color="olive"> authoring_ohne_menue </font>===
 
*'''Aktion''': Erzeugen der DVD-Struktur
 
*'''Input''':${tmp_pfad}/film.mpg
 
*'''Output''':${dvdstruktur_pfad}
 
 
 
===<font color="olive"> abspielen </font>===
 
*'''Aktion''': Abspielen des Videos zur Kontrolle mit Option auf das Speichern eines Screenshots
 
*'''Input''': ${brenn_pfad}
 
*'''Output''': Bildschirm / ${screenshot_pfad}
 
 
 
===<font color="olive"> brennen_video_dvd </font>===
 
*'''Aktion''': Brennen der Video-DVD
 
*'''Input''': ${brenn_pfad}
 
*'''Output''': DVD
 
 
 
==<font color="green"> Szenario 2 </font>==
 
Identisch mit Szenario 1 bis einschließlich "authoring_ohne_menue". Danach geht's weiter mit
 
 
 
===<font color="olive"> sichern_struktur </font>===
 
*'''Aktion''': Sichern der DVD-Struktur
 
*'''Input''': ${dvdstruktur_pfad}
 
*'''Output''': ${sicherungs_pfad}/${sicherungsordner}
 
 
 
==<font color="green"> Szenario 3 </font>==
 
 
 
===<font color="olive"> brenn_pfad=`verzeichnisauswahl` </font>===
 
*'''Aktion''': In "verzeichnisauswahl" wird der aktuelle Brennpfad festgelegt
 
*'''Input''': Über KDE-Fenster ausgewählter Pfad
 
*'''Output''': $verzeichnis
 
 
 
===<font color="olive"> abspielen </font>===
 
*'''Aktion''': Abspielen des Videos zur Kontrolle mit Option auf das Speichern eines Screenshots
 
*'''Input''': ${brenn_pfad}
 
*'''Output''': Bildschirm / ${screenshot_pfad}
 
 
 
===<font color="olive"> brennen_video_dvd </font>===
 
*'''Aktion''': Brennen der Video-DVD
 
*'''Input''': ${brenn_pfad}
 
*'''Output''': DVD
 
 
 
==<font color="green"> Szenario 4 </font>==
 
 
 
===<font color="olive"> brenn_pfad=${tmp_pfad}` </font>===
 
Damit kann später das, was im tmp_pfad steht, gebrannt werden
 
 
 
===<font color="olive"> filmauswahl </font>===
 
*'''Aktion''': Auswahl des zu bearbeitendes Films
 
*'''Input''': Über KDE-Fenster ausgewählte Eingangsdatei
 
*'''Output''': $quelldatei
 
 
 
===<font color="olive"> pjx_ts_gui </font>===
 
*'''Aktion''': Aufruf des Programms ProjectX zum Schneiden und Wandeln zum TS-Stream
 
*'''Input''': $quelldatei
 
*'''Output''': $dvd_tmp/*.ts
 
 
 
===<font color="olive"> brennen_ts </font>===
 
*'''Aktion''': Brennen der TS-files auf eine oder mehrere DVD's
 
*'''Input''': $dvd_tmp/*.ts
 
*'''Output''': DVD
 
  
==<font color="green"> Szenario 5 </font>==
+
==<font color="green"> Initialisierung </font>==
 +
*'''basisverzeichnis_festlegen''': Festlegen des Basisverzeichnisses
 +
*'''arbeitsverzeichnisse_erstellen''': Im Basisverzeichnis werden die Arbeitsverzeichnisse angelegt
 +
*'''programmerkennung''': Erkennung der notwendigen Helferprogramme
 +
*'''variablenzuweisungen''': zur besseren Lesbarkeit des Scriptes
 +
*'''konfiguration''': X.ini für ProjectX anlegen und einige Werte vordefinieren
 +
*'''loeschen_temporaere_arbeitsordner''': Definierten Anfangszustand herstellen
  
===<font color="olive"> filmauswahl </font>===
+
==<font color="green"> Hauptmenue </font>==
*'''Aktion''': Auswahl des zu bearbeitendes Films
+
Mit Aufruf der Funktion hauptmenue () wird ein Aufgabenbereich gewählt. Entspechend dieses Aufgabenbereiches wird zu den Untermenues verzweigt.
*'''Input''': Über KDE-Fenster ausgewählte Eingangsdatei
 
*'''Output''': $quelldatei
 
  
===<font color="olive"> pjx_ts_gui </font>===
+
==<font color="green"> Untermenues </font>==
*'''Aktion''': Aufruf des Programms ProjectX zum Schneiden und Wandeln zum TS-Stream
 
*'''Input''': $quelldatei
 
*'''Output''': $dvd_tmp/*.ts
 
  
===<font color="olive"> sichern_ts </font>===
+
===<font color="olive"> untermenue_video_dvd </font>===
*'''Aktion''': Sichern der TS-files
 
*'''Input''': ${tmp_pfad}/*.ts
 
*'''Output''': ${sicherungs_pfad}/${sicherungsordner}
 
  
==<font color="green"> Szenario 6 </font>==
+
====Fernsehaufnahme schneiden und als Video-DVD brennen====
 +
*'''filmauswahl_dvd''': Das gewünschte Videofile wird geladen
 +
*'''pjx_demux_gui''': und mit ProjectX geschnitten und demultiplext
 +
*'''requantisieren''': Passt der Film nicht auf eine DVD wird er requantisiert
 +
*'''multiplexen''': Bild und Ton werden nun wieder gemultiplexed.
 +
*'''authoring_ohne_menue''': Vom mpg-file wird die DVD-Struktur erstellt,
 +
*'''abspielen''': noch einmal einer "Sichtprüfung" (mit optionaler Screenshot-Möglichkeit) unterzogen,
 +
*'''brennen_video_dvd''': um danach als Video-DVD gebrannt zu werden.
  
===<font color="olive"> brenn_pfad=`verzeichnisauswahl` </font>===
+
====Fernsehaufnahme schneiden und DVD-Struktur in Datei sichern====
*'''Aktion''': In "verzeichnisauswahl" wird der aktuelle Brennpfad festgelegt
+
*'''filmauswahl_dvd''': Das gewünschte Videofile wird geladen
*'''Input''': Über KDE-Fenster ausgewählter Pfad
+
*'''pjx_demux_gui''': und mit ProjectX geschnitten und demultiplext
*'''Output''': $verzeichnis
+
*'''requantisieren''': Passt der Film nicht auf eine DVD wird er requantisiert
 +
*'''multiplexen''': Bild und Ton werden nun wieder gemultiplexed.
 +
*'''authoring_ohne_menue''': Vom mpg-file wird die DVD-Struktur erstellt,
 +
*'''abspielen''': noch einmal einer "Sichtprüfung" (mit optionaler Screenshot-Möglichkeit) unterzogen,
 +
*'''sichern_dvd_struktur''': um nun im Sicherungsverzeichnis gespeichert zu werden
  
===<font color="olive"> brennen_ts </font>===
+
====DVD-Struktur brennen====
*'''Aktion''': Brennen der TS-files auf eine oder mehrere DVD's
+
*'''verzeichnisauswahl_dvd''': Aus dem Sicherungsverzeichnis wird eine gespeicherte DVD-Struktur geladen.
*'''Input''': $dvd_tmp/*.ts
+
*'''abspielen''': noch einmal einer "Sichtprüfung" (mit optionaler Screenshot-Möglichkeit) unterzogen,
*'''Output''': DVD
+
*'''brennen_video_dvd''': um danach als Video-DVD gebrannt zu werden.
  
==<font color="green"> Szenario 7 </font>==
+
===<font color="olive"> untermenue_ts </font>===
  
===<font color="olive"> filmauswahl </font>===
+
====Fernsehaufnahme schneiden, TS als Daten-DVD brennen====
*'''Aktion''': Auswahl des zu bearbeitendes Films
+
*'''filmauswahl_ts''': Das gewünschte Videofile wird geladen
*'''Input''': Über KDE-Fenster ausgewählte Eingangsdatei
+
*'''pjx_ts_gui''': und mit ProjectX geschnitten und gewandelt nach TS,
*'''Output''': $quelldatei
+
*'''brennen_ts''': um danach als Daten-DVD gebrannt zu werden
  
===<font color="olive"> pjx_clip </font>===
+
====Fernsehaufnahme schneiden, TS sichern====
*'''Aktion''': Aufruf des Programms ProjectX zum Schneiden und Demultiplexen. Der Ton wird dabei zu einem wav-file decodiert.
+
*'''filmauswahl_ts''': Das gewünschte Videofile wird geladen
*'''Input''': $quelldatei
+
*'''pjx_ts_gui''': und mit ProjectX geschnitten und gewandelt nach TS,
*'''Output''': $dvd_tmp/film.m2v und/oder $dvd_tmp/*.wav und/oder $dvd_tmp/*.ac3 (ac3-Datei wird später gelöscht)
+
*'''sichern_ts''': um nun im Sicherungsverzeichnis gespeichert zu werden
  
===<font color="olive"> normalisieren </font>===
+
====gesichertes TS-file als Daten-DVD brennen====
*'''Aktion''': Ton auf eine definierte lautstärke bringen
+
*'''verzeichnisauswahl_ts''': Aus dem Sicherungsverzeichnis wird ein gespeicherter TS-Stream geladen,
*'''Input''': ${tmp_pfad}/film.mp2.wav
+
*'''brennen_ts''': um danach als Daten-DVD gebrannt zu werden
*'''Output''': ${tmp_pfad}/film.mp2.wav
 
  
===<font color="olive"> encode2mp2 </font>===
+
===<font color="olive"> untermenue_videoclip </font>===
*'''Aktion''': Audio-wav-file encodieren zu mp2
 
*'''Input''': ${tmp_pfad}/film.mp2.wav
 
*'''Output''': ${tmp_pfad}/film.mp2
 
  
===<font color="olive"> multiplexen </font>===
+
====DVB-Clip: Schneiden und speichern (Ton: MP2 normalisiert + AC3)====
*'''Aktion''': Multiplexen der seperaten Audio- und Videofiles
+
*'''filmauswahl_clip''': Der gewünschte Videoclip wird geladen
*'''Input''': $dvd_tmp/film.m2v und/oder $dvd_tmp/*.mp2 und/oder $dvd_tmp/*.ac3
+
*'''pjx_demux_gui''': und mit ProjectX geschnitten und demultiplext
*'''Output''': ${tmp_pfad}/film.mpg
+
*'''normalisieren''': Der mp2-Ton wird normalisiert.
 +
*'''multiplexen''': Bild und Ton werden nun wieder gemultiplexed.
 +
*'''sichern_clip''': um nun im Videoclip-Verzeichnis gespeichert zu werden
  
===<font color="olive"> fehler </font>===
+
====DVB-Clip: Schneiden und speichern (Ton: AC3)====
*'''Aktion''': Programmabbruch, wenn nicht multiplext werden konnte
+
*'''filmauswahl_clip''': Der gewünschte Videoclip wird geladen
*'''Input''': ${tmp_pfad}/film.mpg
+
*'''pjx_demux_gui''': und mit ProjectX geschnitten und demultiplext
*'''Output''': exit
+
*'''ac3_behalten''': Alle Tonspuren, die nicht "AC3" heißen, werden gelöscht.
 +
*'''multiplexen''': Bild und Ton werden nun wieder gemultiplexed.
 +
*'''sichern_clip''': um nun im Videoclip-Verzeichnis gespeichert zu werden
  
===<font color="olive"> clip_speichern </font>===
+
====DVB-Clip: Schneiden und speichern (Ton: MP2 normalisiert)====
*'''Aktion''': Den Videoclip speichern
+
*'''filmauswahl_clip''': Der gewünschte Videoclip wird geladen
*'''Input''': KDE-Auswahlfenster / ${tmp_pfad}/film.mpg
+
*'''pjx_demux_gui''': und mit ProjectX geschnitten und demultiplext
*'''Output''': ${clipspeicher}
+
*'''mp2_behalten''': Alle Tonspuren, die nicht "mp2" heißen, werden gelöscht.
 +
*'''multiplexen''': Bild und Ton werden nun wieder gemultiplexed.
 +
*'''sichern_clip''': um nun im Videoclip-Verzeichnis gespeichert zu werden
  
==<font color="green"> Szenario 8 </font>==
+
====Mpeg1-Clip: Schneiden und speichern (Ton: MP2 normalisiert)====
Identisch mit Szenario 7 bis auf die Funktion pjx_clip. Diese wird ersetzt durch
+
*'''filmauswahl_clip''': Der gewünschte mpeg1-Videoclip wird geladen
 +
*'''pjx_demux_gui''': und mit ProjectX geschnitten und demultiplext
 +
*'''normalisieren''': Der mp2-Ton wird normalisiert.
 +
*'''multiplexen''': Bild und Ton werden nun wieder gemultiplexed.
 +
*'''sichern_clip''': um nun im Videoclip-Verzeichnis gespeichert zu werden
  
===<font color="olive"> mpeg1_input </font>===
+
Das war's!
*'''Aktion''': mpeg1-Video  demultiplexen. Dabei den Ton zu einem wav-file decodieren
 
*'''Input''': $quelldatei
 
*'''Output''': ${tmp_pfad}/film.mp2.wav und ${tmp_pfad}/film.m1v
 
  
 
{{Dvbscript navigationsbox}}
 
{{Dvbscript navigationsbox}}

Version vom 19. August 2008, 18:53 Uhr


Vom DVB zur DVD, ein Wikibuch: Übersicht - Der Weg - Die Helferprogramme - Das Script - Installation - Bedienungsanleitung - Programmieranleitung


In diesem Artikel wird näher darauf eingegangen, wie das Script aufgebaut ist und warum es so funktioniert, wie es funktioniert. Beschrieben wird dies an Hand der Scriptversion 0.6.0.

Inhaltsverzeichnis

Die Funktionen

Für's Austesten

stop ()

Ist für Fehlersuche und Debugging gedacht und hält das Script an der gewünschten Stelle an.

Initialisierung

basisverzeichnis_festlegen ()

In der versteckten Datei ~/.dvb_wiki_script_arbeitsverzeichnis.txt wird der Pfad zum Basisverzeichnis gespeichert. In diesem Basisverzeichnis befinden sich die Arbeitsordner des Scripts. Ist diese Textdatei nicht vorhanden, ist das ein Indiz dafür, daß das Script zum ersten Mal ausgeführt wird.

if [ ! -e ~/.dvb_wiki_script_arbeitsverzeichnis.txt ]

Wenn die Textdatei nicht vorhanden ist, das Script also zum ersten Mal Läuft, dann

hilfsverzeichnis=`kdialog --caption "Name des Arbeitsverzeichnisses" --inputbox ~/ dvb_wiki_script`

Frage nach dem gewünschten Basisverzeichnis

  • kdialog: KDE-Dialogbox
  • --caption "Name des Arbeitsverzeichnisses": mit dem Titel "Name des Arbeitsverzeichnissses"
  • --inputbox: welche als Eingabebox verwendet wird
  • ~/: In der Box wird der Pfad zum persönlichen Heimatverzeichnis als Beschreibung angezeigt
  • dvb_wiki_script: Als Standardeingabe wird "dvb_wiki_script" festgelegt
  • hilfsverzeichnis: In diese Variable wird die Eingabe gespeichert
if [ $? = 0 ]

Wenn die Eingabe mit "OK" bestätigt wurde, dann

basisverzeichnis=~/`echo $hilfsverzeichnis | tr -d " "`

werden eventuelle Leerzeichen aus der Eingabe entfernt (tr -d " ")und das Ergebnis in die Variable "basisverzeichnis" geschrieben

if [ -e ${basisverzeichnis} ]

Existiert bereits ein "basisverzeichnis" an dem gewünschten Ort, dann

kdialog --passivepopup "Verzeichnis existiert schon! Bitte neu wählen" 3
basisverzeichnis_festlegen

erfolgt ein Hinweis auf diese Tatsache. Nach drei Sekunden verschwindet die Popupbox und es wird die Funktion "basisverzeichnis_festlegen" erneut aufgerufen.

else

Gibt es das Verzeichnis noch nicht

kdialog --passivepopup "Die Verzeichnisstruktur wird in folgendem Arbeitsverzeichnis erstellt: ${basisverzeichnis}" 
echo ${basisverzeichnis} > ~/.dvb_wiki_script_arbeitsverzeichnis.txt

wird angezeigt, wo das Basisverzeichnis angelegt wird. Anschließend wird der Inhalt der Variable "basisverzeichnis", also der Pfad zum Basisverzeichnis in die versteckte Textdatei geschrieben.

kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
exit

Wurde in der Eingabebox auf Abbrechen gedrückt, wird das Script nach einem Hinweis beendet.

arbeitsverzeichnisse_erstellen ()

basisverzeichnis=`cat ~/.dvb_wiki_script_arbeitsverzeichnis.txt`

Der Pfad zum Basisverzeichnis wird aus der versteckten Testdatei gelesen und in die Variable "basisverzeichnis" geschrieben.

if [ ! -e ${basisverzeichnis} ] ; then mkdir ${basisverzeichnis} ; fi

Nun wird das Basisverzeichnis mit mkdir angelegt. Die if-Abrage dient nur zur Vermeidung von Fehlermeldungen, die auftreten würden, wenn das anzulegende Verzeichnis schon existiert, was ja ab dem zweiten Scriptlauf der Fall ist.

Anschließend werden die einzelnen Arbeitsverzeichnisse angelegt:

  • dvd_aufnahme: Hier wird zuerst nach den zu bearbeitenden Filmen gesucht.
  • dvd_tmp: Hier legen die Helferprogramme Zwischenergebnisse ab und suchen nach den Ergebnissen anderen Helferprogramme
  • dvd_struktur: In diesem Ordner wird die fertige DVD-Struktur zwischengespeichert.
  • dvd-sicherung: Hierhin werden fertige Arbeitsergebnisse gesichert, wenn das vom User so gewünscht wird.
  • default: Hier stehen die Pfadnamen der Helferprogramme und die Initialisierungsdateien für ProjectX.
  • screenshot: Mit kaffeine erstellte Screenshots der Filme / Clips, die ich dann zum Bedrucken der DVD verwende.

programmerkennung ()

In dieser Routine wird nachgesehen, ob die notwendigen Helferprogramme installiert sind. Und das funktioniert so:

Hauptschleife

for ((i=0 ; i<9 ; i++))

Diese Schleife wird neunmal durchlaufen, so oft also, wie Helferprogramme vorhanden sind.

Alles folgende spielt sich in der Schleife ab.

Default-Pfade lesen

pfad[i]=`cat $basisverzeichnis/default/pfad[$i].txt`
  • $basisverzeichnis/default/pfad[$i].txt: Der Inhalt dieser Datei (das ist der Pfad, wo das zugehöige Programm gefunden werden kann)
  • cat: wird gesendet (über die Standartausgabe)
  • pfad[i]=`...`: an die Variable ${pfad[i]}

Das i steht immer für die Nummer des Schleifendurchlaufs und damit dafür, welches Programm gerade gesucht wird.

Helferprogramm vorhanden?

if [ ! -e ${pfad[i]}/${name[i]} ]

Wenn das Programm nicht existiert,dann

Programmsuche

gefundene_pfade=`find ${suchpfade} -type f -name ${name[i]} -printf "%h "`
  • find ${suchpfade}: In den Suchpfaden suchen
  • -type f: nach einer normalen Datei
  • -name ${name[i]}: mit dem Namen, der in der Variablen ${name[i]} steht.
  • -printf "%h ": Von den gefundenen Dateien werden die Verzeichnisnamen ausgegeben
  • gefundene_pfade=: und in diese Variable geschrieben

Wieviele Versionen des Helferprogramms gefunden?

pfadanzahl=`echo "$gefundene_pfade" | wc -w`
  • echo "$gefundene_pfade": Von dem, was in der Variablen $gefundene_pfade steht
  • wc -w werden die Worte gezählt (und damit die Anzahl der gefundenen Pfade).
  • pfadanzahl=: diese Anzahl wird in die Variable $pfadanzahl geschrieben.

Was wird damit gemacht?

case "$pfadanzahl" in

In Abhängigkeit der Anzahl der gefundenen Pfade passiert folgendes:

  • 0): Anzahl 0, das Programm wurde nicht gefunden.

Nach einem Hinweis wird das Script beendet . Das fehlende Helferprogramm muß installiert werden..

  • 1): Anzahl 1, das Programm existiert genau einmal.

Der dazugehörige Pfad wird in das Default-Verzeichnis geschrieben.

  • *): Das Programm existiert mehr als einmal.

Es wird nachgefragt (kdialog --combobox), welcher der Pfade verwendet werden soll. Dieser Pfad wird dann ins Default-Verzeichnis geschrieben.

Nachdem diese Routine neunmal erfolgreich durchlaufen ist, ist die Funktion beendet und es geht mit der im Hauptprogramm folgenden Funktion weiter

variablenzuweisungen ()

Diese Zuweisungen haben den Sinn, das Script besser lesbar zu machen. Im Script selbst wird dann zum größten Teil mit diesen Variablen gearbeitet bzw. mit in Variablen gespeicherten Pfaden. Durch diese Strategie kann das Script einfach an neue Gegebenheiten anpepasst werden. Es muß nicht lange im Code gesucht werden, an welchen Stellen was geändert werden muß. Es braucht nur der Inhalt der entsprechenden Variablen ausgetauscht werden.

konfiguration ()

X.ini für Filmbearbeitung

Die X.ini.film enthält folgende Einstellungen:

  • Application.Agreement=1: Ja zur Lizenz
  • Application.Language=de: PJX startet auf deutsch
  • WindowPosition.Main.Heigh/Width: Größe des PJX-Fensters
  • WindowPosition.Main.X/Y: Position des Fensters (hier rechts oben)
  • optionPanel.NormalLog=0: Es wird keine Log-Datei geschrieben (die würde bloß stören)
  • OptionPanel.CloseOnEnd=1: Nachdem PJX fertig ist, beendet es sich selber

Die X.ini wird im Default-Verzeichnis abgelegt, von wo sie bei Bedarf von ProjectX geladen wird.

Werden im PJX-Fenster irgendwelche Einstellungen verändert, so werden diese Änderungen nicht in die X.ini übernommen. Das wurde absichtlich so programmiert, damit man immer einen definierten Ausgangszustand hat.
Wird hier eine Speicherung gewünscht, kann dies durch einen zusätzlichen Eintrag in die X.ini erfolgen. Dann steht man allerdings vor dem Problem, oft nicht zu wissen, mit welchen Einstellungen PJX denn nun tatsächlich startet. Da es mir immer wieder so ging, kann ich nur raten, die Speicherung ausgeschalten zu lassen.

Voreinstellungen

Hier werden Variablen mit Voreinstellungen belegt, die bei Bedarf geändert werden können (aber nur, wenn man weiß, wie die Auswirkungen sind).

== Löschfunktionen

loeschen_temporaere_arbeitsordner ()

  • rm: Die Inhalte der Ordners ${basisverzeichnis}/dvd_tmp und ${basisverzeichnis}/dvd_tmp1 werden gelöscht.
  • rm -r: Der Ordner ${basisverzeichnis}/dvd_struktur enthält Verzeichnisse, die wiederum Dateien enthalten und muß des halb rekursiv gelöscht werden.

Aufgabenmenues

hauptmenue ()

auswahl_hauptmenue=`kdialog --caption "Hauptmenue" --geometry 200x250+500+400 --radiolist "Bitte einen Aufgabenbereich wählen" \
  • kdialog: Das KDE-Dialog-Programm
  • --caption "Hauptmenue": öffnet ein Fenster, das den Namen "Hauptmenue" trägt
  • --geometry 200x250+500+400: und diese Größe und Position hat
  • --radiolist als Liste mit Radio-Buttons
  • "Bitte einen Aufgabenbereich wählen": Das wird gefragt.
  • auswahl_hauptmenue`...`: In diese Variable wird die Nummer der Antwort geschrieben.

Diese Nummer wird dann später vom Hauptprogramm ausgewertet.

if [ $? != 0 ]
then
	kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
	exit
fi

Wenn im Auswahlfenster auf Abbrechen gedrückt wird, dann wird das Script beendet.

untermenue_video_dvd () ()

Diese Funktion arbeitet analog zum Hauptmenue mit dem Untrscheid, daß die Antwortnummer in die Variable was_tun gespeichert wird.

untermenue_ts () ()

Siehe Funktion untermenue_video_dvd ()

untermenue_videoclip () () ()

Siehe Funktion untermenue_video_dvd ()

Auswahl der Eingangsdateien

filmauswahl_dvd ()

Die Variable brenn_pfad wird mit dem Inhalt der Variablen ${dvdstruktur_pfad} belegt. Danach wird die Funktion filmauswahl () aufgerufen.

filmauswahl_ts ()

Die Variable brenn_pfad wird mit dem Inhalt der Variablen ${tmp_pfad} belegt. Danach wird die Funktion filmauswahl () aufgerufen.

filmauswahl ()

quelldatei=`kdialog --caption "Filmauswahl" --geometry 600x500-0+0 --getopenfilename ${aufnahme_pfad}`
  • kdialog: Das KDE-Dialog-Programm
  • --caption "Filmauswahl": öffnet ein Fenster, das den Namen "Filmauswahl" trägt
  • --geometry 600x500-0+0: und diese Größe und Position hat
  • --getopenfilename: Es wird ein KDE-Fenster geöffnet, in dem aus einer Liste von Dateien ausgewählt werden kann
  • ${aufnahme_pfad}: Es werden die Dateien in diesem Pfad zur Auswahl angeboten.
  • quelldatei=`...`: Die ausgewählte Datei wird in die Variable $quelldatei geschrieben.

verzeichnisauswahl_dvd ()

Die Variable $verzeichnistyp wird mit dem String *_dvd belegt. Dieser String wird zur Dateisuche mit find in der nun aufgerufenen Funktion verzeichnisauswahl () benötigt.

verzeichnisauswahl_ts ()

Die Variable $verzeichnistyp wird mit dem String *_ts belegt. Dieser String wird zur Dateisuche mit find in der nun aufgerufenen Funktion verzeichnisauswahl () benötigt.

verzeichnisauswahl()

anzahl_der_sicherungen=`find $sicherungs_pfad/$verzeichnistyp -maxdepth 0 -type d | wc -l`

Die Anzahl der gesicherten Arbeitsergebnisse (*_dvd oder *_ts) wird ermittelt und zwischengespeichert.

hilfsverzeichnis=`find $sicherungs_pfad/$verzeichnistyp -maxdepth 0 -type d`

Die Namen der gesicherten Arbeitsergebnisse (*_dvd oder *_ts) wird ermittelt und zwischengespeichert. case $anzahl_der_sicherungen in In Abhängigkeit der Anzahl der gesicherten Arbeitsverzeichnisse ergeben sich folgende Möglichkeiten:

  • Anzahl 0: Das Script wird nach einem Hinweis beendet, da keine passene Sicherung zum Brennen gefunden wurde
  • Anzahl 1: Die gefundene Sicherung wird zur Weiterverarbeitung in die Variable $verzeichnis geschrieben.
  • Anzahl *: Die gewünschte Sicherung wird mit kdialog ausgewählt und zur Weiterverarbeitung in die Variable $verzeichnis geschrieben und in die Variable $brenn_pfad kopiert.

Eingangsverarbeitung

pjx_demux_gui ()

java -jar ${pjx} -demux -gui  -ini ${default_pfad}/X.ini.film -out ${tmp_pfad} -name film "$quelldatei" 1>/dev/null
  • java -jar: Es wird ein Java-Programm gestartet
  • ${pjx}: und zwar das Programm ProjectX (z.B.: ~/ProjectX/ProjectX.jar)
  • -demux: Der mpeg-Stream wird demultiplext
  • -gui: PJX startet mit graphischer oberfläche (notwendig nur, wenn mit PJX geschnitten werden soll)
  • -ini ${default_pfad]/X.ini.film: mit dieser Initialisierungsdatei wird PJX gestartet.
  • -out $tmp_pfad: Hierhin wird das Bearbeitungsergebnis geschrieben
  • -name film: Die Ausgabedatei erhält den Basisnamen "film"
  • $quelldatei:Dieser Stream wird verarbeitet
  • 1>/dev/null: Alles, was ich an Ausgeben auf dem Bildschirm nicht sehen will, wird ins Leere geschickt.

pjx_ts_gui ()

java -jar ${pjx} -tots -gui -split 4300 -ini ${default_pfad}/X.ini.film -out ${tmp_pfad} -name film "$quelldatei" 1>/dev/null
  • java -jar: Es wird ein Java-Programm gestartet
  • ${pjx}: und zwar das Programm ProjectX (z.B.: ~/ProjectX/ProjectX.jar)
  • -tots: Der Film wird zum TS-File gewandelt
  • -gui: PJX startet mit graphischer oberfläche (notwendig nur, wenn mit PJX geschnitten werden soll)
  • -split 4300: Bei 4300 Mbyte wird die Aufnahme gesplittet (mehr passt nicht auf eine DVD drauf)
  • -ini ${default_pfad]/X.ini.film: mit dieser Initialisierungsdatei wird PJX gestartet.
  • -out $tmp_pfad: Hierhin wird das Bearbeitungsergebnis geschrieben
  • -name film: Die Ausgabedatei erhält den Basisnamen "film"
  • $quelldatei:Dieser Stream wird verarbeitet
  • 1>/dev/null: Alles, was ich an Ausgeben auf dem Bildschirm nicht sehen will, wird ins Leere geschickt.

mpeg1_input ()

${ffmpeg} -i "${quelldatei}" -acodec copy ${tmp_pfad}/film.mp2 -vcodec copy ${tmp_pfad}/film.m1v
  • ${ffmpeg}: Aufruf von ffmpeg (z.B.: /usr/bin/ffmpeg),
  • -i ${quelldatei}: um diesen Video-Clip zu demultiplexen

Bearbeitung

requantisieren ()

Jetzt gibt es, oh Schreck, etwas Mathematik. Mathe ist nicht nur etwas, mit dem viele Normal-Sterbliche, egal welchen Alters, auf Kriegsfuß stehen. Mathe ist auch etwas, mit dem die Bash nicht so ohne weiteres umgehen kann, wäre da nicht ein kleines eingebautes Tool mit dem Namen "bc". Mit diesem Tool hat die Bash einen Taschenrechner.Und genau so einen Rechner brauchen wir in dieser Funktion.

Der Sinn dessen, was wir hier tun, ist es, einen Film so zu stauchen, daß er auf eine einzelne DVD passt. Dieses Stauchen wollen wir, etwas eleganter, Requantisieren nennen. Und der "Stauchfaktor", also um wieviel mal das Ausgangsmaterial kleiner gemacht werden soll, bekommt von uns den Namen "Requantisierungsfaktor".

Es macht wenig Sinn, ein Audiofile verkleinern zu wollen. Ein Videofile mit seinen etlichen GByte Größe bietet hier mehr Aussicht auf Erfolg.

Die Formel, nach der wir den Requantisierungsfaktor berechnen, lautet so:

Requantifizierungsfaktor = ("Größe des Videofiles" / ("Was auf die DVD maximal passt" - "Summe aller Audiofiles"))*1,04

Wieso diese Formel gerade so lautet, darf der geneigte Leser selber zu ergründen versuchen. Eine kleine Denksportaufgabe ist mit Sicherheit nicht die Schlechteste aller Freizeitbeschäftigungen. Ich verrate nur soviel, daß der Faktor 1,04 dafür da ist, die Verwaltung des Dateisystems auf der DVD zu berücksichtigen (Die einzelnen Ordner brauchen ja schließlich auch Platz).

Schauen wir uns also eine Umsetzung dieser Formel in der Bash an:

videogroesse

videogroesse=`du -bc ${tmp_pfad}/*.m2v | cut -f1 | tail -n 1`
  • du: Bashprogramm, welches den Platzverbrauch von Dateien schätzt
  • -b: Ausgabe der Größe in Bytes
  • -c: Erzeugen einer Gesamtsumme (-b und -c sind zusammen gefasst nach -bc. dieses bc ist allerdings nicht identisch mit dem oben angepriesenen gleichnamigen Tachenrechner. Der kommt nachher noch)
  • ${tmp_pfad}/*.m2v: Alle Dateien im tmp_pfad, deren Name auf .m2v endet, gehen in die Größenermittlung ein.
  • tail -n 1: Nur die letzte Zeile dessen, was "du" ausgeben will, wird auch tatsächlich ausgegeben (nämlich unsere Gesamtgrösse)
  • cut -f1: Von dieser letzten Zeile wird nur das erste Feld ausgegeben, also die reine Zahl
  • videogroesse=`....`: Diese Groesse wird in die Variable $videogroesse geschrieben

audiosumme

audio_summe=`du -bc ${tmp_pfad}/*.ac3 ${tmp_pfad}/*.mp2 | cut -f1 | tail -n 1`
  • du: Bashprogramm, welches den Platzverbrauch von Dateien schätzt
  • -b: Ausgabe der Größe in Bytes
  • -c: Erzeugen einer Gesamtsumme (-b und -c sind zusammen gefasst nach -bc. dieses bc ist allerdings nicht identisch mit dem oben angepriesenen gleichnamigen Tachenrechner. Der kommt nachher noch)
  • ${tmp_pfad}/*.ac3 ${tmp_pfad}/*.mp2: Alle Dateien im tmp_pfad, deren Name auf .ac3 oder .mp2 endet, gehen in die Größenermittlung ein.
  • tail -n 1: Nur die letzte Zeile dessen, was "du" ausgeben will, wird auch tatsächlich ausgegeben (nämlich unsere Gesamtgrösse)
  • cut -f1: Von dieser letzten Zeile wird nur das erste Feld ausgegeben, also die reine Zahl
  • audio_summe=`....`: Diese Groesse wird in die Variable $audio_summe geschrieben

audio_video_summe

audio_video_summe=`du -bc ${tmp_pfad}/*.ac3 ${tmp_pfad}/*.mp2 ${tmp_pfad}/*.m2v | cut -f1 | tail -n 1`

Das Prinzip sollte nun bekannt sein. Das Ergebnis ist die Groesse der Summe aller Video- und Audiofiles und findet sich in der Variablen $audio_video_summe wieder

requantisierungsfaktor

requantisierungsfaktor=`echo "scale=8 ; ${videogroesse}/$((maxgroesse-audio_summe))*1.04" | bc`
  • bc: Nun ist er endlich da, unser Taschenrechner
  • ${videogroesse}/$((maxgroesse-audio_summe))*1.04: Diese Formel wird ausgerechnet
  • scale=8: auf 8 Nachkommastellen genau
  • echo: und der Nachwelt zu Verfügung gestellt,
  • requantisierungsfaktor=`....`: indem es in diese Variable geschrieben wird

Muß requantisiert werden?

if [ $audio_video_summe -ge $maxgroesse ] ; then

Wenn die Summe der Audio- und Videofiles größer ist als das, was auf die DVD drauf passt, dann wird die requantisiert.

Die Requantisierung

${tcrequant} -d2 -i ${tmp_pfad}/film.m2v -o ${tmp_pfad}/film.requant -f ${requantisierungsfaktor}
  • ${tcrequant}: Aufruf von tcrequant (z.B.: /usr/bin/tcrequant)
  • -d2: Den Bearbeitungsfortschritt anzeigen
  • -i ${tmp_pfad}/film.m2v: Dieses Videofile wird requantisiert
  • -o ${tmp_pfad}/film.requant: Das ist das Ergebnis der Requantisierung
  • -f ${requantisierungsfaktor}:Mit diesem Faktor wird requantisiert
mv ${tmp_pfad}/film.requant ${tmp_pfad}/film.m2v

Die Datei film.requant wird zu film.m2v umbenannt. Diese Namensänderung ist notwendig, da die Funktion "multiplex ()" das Videofile unter dem Namen film.m2v erwartet.

normalisieren ()

Meine schon etwas in die Jahre gekommene Stereoanlage zeichnet sich noch dadurch aus, daß ein großer Drehknopf zur Lautstärkeregelung vorhanden ist. Und den kann man aufdrehen, bis buchstäblich die Wände wackeln (4 x 70 W Sinus können ganz schön Dampf machen). Aber irgendwann ist Schluß. Nein, nicht daß die Nachbarn sich beschweren würden. Der Regler ist vielmehr am Rechtanschlag angelangt und die Anlage liefert die maximal mögliche Lautstärke.

Auch die Audio-Files, mit denen wir hier im Script herumjonglieren, kennen einen maximal möglichen Pegel. Der ist nämlich denn erreicht, wenn die Bytes, welche die Lautstärke im Digitalsignal kennzeichnen ihre Maximalwerte erhalten (z.B.: FFFF bei 4 Byte, mehr geht einfach nicht, es sei denn, man macht ein fünftes Byte auf).

Fernsehsender beanspruchen für sich eine gewisse Individualität. Manchmal kommt es mir so vor, daß diese Individualität dadurch zum Ausdruck gebracht wird, daß jeder Sender sein Programm mit einer anderen Lautstärke ausstrahlt. Das ist schon beim Zappen unangenehm. Noch unerfreulicher wird diese Tatsache jedoch, wenn die mühsam aufgenommenen Videoclips mit Hilfe einer Wiedergabeliste abgespielt werden. Denn bei jedem zweiten Stück ist ein Griff zum Lautstärkeregler notwendig. Beim einen Lied versteht man kaum, was aus den Lautsprechern kommt, beim nächsten Mal brüllt es einen geradezu aus dem Sessel heraus.

Ein PCM-Signal auf einen definierten Lautstärkepegel zu bringen, ohne die Dynamik selbst zu verändern, wird "normalisieren" genannt.

Mit dem in dieser Funktion verwendeten Befehl "normalize" wird die lauteste Stelle in dem Audio-File "film.mp2.wav" auf -12dBfs (also 12dB unter "full scale") gebracht. Der Rest wird entsprechend mitgezogen. Aber, wie gesagt, ohne Verlust an Dynamik.

Das Normalisieren funktioniert nur mit PCM-Files. eine komprimierte Datei (mp2) muß erst zu PCM (wav) decodiert werden.

Beim mp3-Format wird übrigens eine andere Strategie zum Normalisieren angewandt, und zwar eine ohne Umcodierverluste. Hier bleibt das ursprünliche File erhalten. Lediglich in den Header wird die Information geschrieben, um wieviel die Lautstärke angepasst werden müsste. Der Player wertet diesen Header dann aus und regelt entsprechend die Lautstärke beim Abspielen des Files. Die Voraussetzung ist hier sebstverständlich ein Player, der dies Auswertung auch verarbeiten kann. Dies nur zur Information, daß es noch eine Welt ausßerhalb von mp2 gibt. Ne, noch etwas gibts und das heißt AC3, zu Deutsch "Dolby digital"

Ton-Dateien vorbereiten

mv ${basisverzeichnis}/dvd_tmp/film.mp2 ${basisverzeichnis}/dvd_tmp1
rm ${basisverzeichnis}/dvd_tmp/*.mp2

Es gibt Fernsehsender, die mehr als eine mp2-Tondatei senden, zum Beispiel einen zusätzlich zum normalen Stereoton einen Zweikanalton. Wir wollen uns beim normalisieren ausschließlich auf den Stereoton beschränken. Deshalb werden alle anderen mp2-Dateien gelöscht.

mp2 decodieren

${ffmpeg} -i ${basisverzeichnis}/dvd_tmp1/film.mp2 ${basisverzeichnis}/dvd_tmp1/film.mp2.wav

Aus dem mp2-File wird mit Hilfe von ffmpeg ein wav-File gemacht.

normalisieren

${normalize} -v ${basisverzeichnis}/dvd_tmp1/film.mp2.wav

Das wav-File wird normalisiert. Es überschreibt sich dabei selbst mit dem Ergebnis.

encodieren zu mp2

${ffmpeg} -i ${basisverzeichnis}/dvd_tmp1/film.mp2.wav -acodec mp2 -ab 192k ${tmp_pfad}/film.mp2

Aus einer wav -Datei wird wieder ein mp2-File gemacht.

  • ${ffmpeg}: Aufruf von ffmpeg (z.B.: /usr/bin/ffmpeg)
  • -i ${tmp_pfad1}/film.mp2.wav: Dieses PCM-file
  • -acodec mp2: wird zu einem mp2-File encodiert,
  • -ab 192k: welches eine Audio-bitrate von 192k erhält (mp2-Standard)
  • ${tmp_pfad}/film.mp2: Das Ergebnis findet man dann hier

ac3_behalten ()

Es weden ausschließlich AC3-Tondateien zur Weiterverarbeitung bereitgestellt. Alles andere, was "Ton" heißt, wird gelöscht

mp2_behalten ()

Es weden ausschließlich mp2-Tondateien zur Weiterverarbeitung bereitgestellt. Alles andere, was "Ton" heißt, wird gelöscht

multiplexen ()

Mit mplex wird aus den getrennten Bild- und Ton-Dateien ein mpg-File gemacht, welches für das spätere Authoring mit dvdauthor schon vorbereitet ist.

Vorbereiten der Dateien

  • mpeg1_video=: Es wird eine leere Variabe mpeg1_video erzeugt
  • mpeg1_video=`find ${tmp_pfad} | grep "m1v"`: In diese Variable werden die Namen der Dateien geschrieben, die sich im tmp_pfad befinden und ein "m1v" im Namen haben.

Dasselbe geschieht mit den Variablen mpeg2_viedo, mp2_audio und ac3_audio. Ist im tmp_pfad keine Datei vorhanden, die das angegebene Bitmuster enthält, dann bleibt die entsprechende Variable leer.

Das eigentliche Multiplexen

${mplex} -v1 -f8 -o ${tmp_pfad}/film.mpg ${mpeg1_video} ${mpeg2_video} ${mp2_audio} ${ac3_audio}
  • ${mplex}: Aufruf von mplex (z.B.: /usr/bin/mplex)
  • -v1: Fortschrittsanzeige (beim Befehl mplex leider nicht so sehr fortschrittlich)
  • -f8: Format zur späteren Erzeugung einen DVD
  • -o ${tmp_pfad}/film.mpg: Das Ergebnis
  • ${mpeg1_video} ${mpeg2_video} ${mp2_audio} ${ac3_audio}: die Eingangsdateien, die multiplext werden, enthalten in den angegebenen Variablen. Eine leere Variable wird von mplex ignoriert.

Anschließend werden mit "rm" die nun nicht mehr benötigten Eingangsdateien gelöscht.

authoring_ohne_menue ()

Hier wird der einfachste Fall einer DVD-Struktur erzeugt (ohne DVD-Menue).

${dvdauthor} -o ${dvdstruktur_pfad} -t ${tmp_pfad}/film.mpg 2>&1
  • ${dvdauthor}: Programmaufruf von dvdauthor (z.B.: /usr/bin/dvdauthor)
  • -o ${dvdstruktur_pfad}: Das Ergebnis wird hier zu finden sein
  • -t: Es wird ein Titel erzeugt (Ordner AUDIO_TS: leer / Ordner VIDEO_TS: Inhalt ifo-files und vob-files)
  • ${tmp_pfad}/film.mpg: Diese mpg-Datei wird als Eingangsdatei verwendet
${dvdauthor} -o ${dvdstruktur_pfad} -T
  • -o ${dvdstruktur_pfad}: In diesem Ordner: ${dvdstruktur_pfad}/VIDEO_TS
  • -T: werden noch folgende Dateien erzeugt: VIDEO_TS.BUP und VIDEO_TS.IFO

Ergebniskontrolle

abspielen ()

$kaffeine -nofork --geometry 600x500-0+0 ${brenn_pfad}
  • $kaffeine: Der Videoplayer wird gestartet,
  • --nofork: läuft im Vordergrund
  • ${brenn_pfad}: und spielt die hier enthaltene Datei ab

Brennen

brennen_video_dvd ()

Mit dieser Funktion wird die fertige DVD-Struktur auf DVD kopiert. Das Ergebnis ist eine Video-DVD

${growisofs} -speed=${brenngeschwindigkeit} -dvd-compat -Z /dev/dvd -dvd-video ${brenn_pfad}
  • ${growisofs}: Programmaufruf von growisofs (z.B. /usr/bin/growisofs)
  • -speed=${brenngeschwindigkeit}: maximale Brenngeschwindigkeit
  • -dvd-compat: Schließt nach dem Brennen die DVD ab, um maximale Kompatibilität zu gewährleisten
  • -Z /dev/dvd: Den ersten Satz Daten auf die DVD brennen (,der in unserem Fall auch der einzige ist, nämlich die DVD-Struktur)
  • -dvd-video: udf-Filesystem für Video-DVD's
  • ${brenn_pfad}: Was hier drin steht, wird gebrannt

brennen_ts ()

Brennen der TS-Files als Daten-DVD

dvdzahl=`find ${brenn_pfad} -type f | wc -l`
  • find ${brenn_pfad}: Der Pfad mit den zu brennenden Files wird durchsucht
  • -type f: nach normalen Dateien
  • wc -l: und es wird gezählt, wieviele Dateien das sind
  • dvdzahl=`....`: Diese Anzahl wird mit Hilfe der Substitution in die Variable $dvdzahl geschrieben
for((i=1; i<=${dvdzahl}; i++))

In dieser If-Schleife wird so oft eine neue DVD angefordert, bis alle Dateien gebrannt sind.

kdialog --msgbox "Bitte DVD Nr.: $i einlegen"

Aufforderung , eine neue DVD bzw. die nächste DVD zum Brennen einzulegen

${growisofs} -speed=${brenngeschwindigkeit} -Z /dev/dvd  -allow-limited-size -R -J ${brenn_pfad}/"film($((i-1)))"*
  • ${growisofs}: Programmaufruf für growisofs (z.B. /usr/bin/growisofs)
  • -speed=${brenngeschwindigkeit}: maximale Brenngeschwindigkeit
  • -Z /dev/dvd: Den ersten Satz Daten auf die DVD brennen (,der in unserem Fall auch der einzige ist, nämlich die TS-files)
  • -allow-limited-size: Damit lassen sich Dateien bis zu 4,3GB brennen
  • -R: Rock Ridge Erweiterung benutzen
  • -J: Joliet-Extention benutzen (macht es leichter, die DVD unter Windows abzuspielen)
  • ${brenn_pfad}/"film($((i-1))): Diese Datei auf DVD brennen

Sichern

sichern_dvd_struktur ()

Diese Funktion sichert die DVD-Struktur

sicherungsordner=$(date +%Y%m%d%H%M%S)_dvd

In diesen Sicherungsordner wird die DVD-Struktur geschrieben. Der Name des Ordner wird aus dem aktuellen Datum und der momentanen Uhrzeit generiert.

mkdir ${sicherungs_pfad}/${sicherungsordner}

Hiermit wird der Sicherungsordner angelegt

mv ${dvdstruktur_pfad}/* ${sicherungs_pfad}/${sicherungsordner}

mv verschiebt die DVD-Struktur in den Sicherungsordner

sichern_ts ()

Diese Funktion sichert die TS-files

sicherungsordner=$(date +%Y%m%d%H%M%S)_ts

In diesen Sicherungsordner wird die DVD-Struktur geschrieben. Der Name des Ordner wird aus dem aktuellen Datum und der momentanen Uhrzeit generiert.

mkdir ${sicherungs_pfad}/${sicherungsordner}

Hiermit wird der Sicherungsordner angelegt

mv ${tmp_pfad}/*.ts ${sicherungs_pfad}/${sicherungsordner}

mv verschiebt die TS-files in den Sicherungsordner

sichern_clip ()

Diese Funktion speichert einen Videoclip

clipspeicher=`kdialog --title "$quelldatei" --getsavefilename ${clip_pfad}`
  • kdialog: Programmaufruf für kdialog (z.B. /usr/bin/kdialog)
  • --title "$quelldatei": Überschrift für das KDE-Fenster
  • --getsavefilename: Generiert ein KDE-Fenster, in dem ein Zielverzeichnis zum Speichern ausgewählt werden kann. Auch der Name, den der zu speichernde Clip bekommen soll, wird angegeben.
  • ${clip_pfad}: In dieses Verzeichnis wird bevorzugt gespeichert
  • clipspeicher=`....`: Der gewählte Name und Speicherpfad steht dann in dieser Variable zur Verfügung
mv ${tmp_pfad}/film.mpg ${clipspeicher}

Der Clip wird an den vorhin ausgewählten Ort gespeichert

Hauptprogramm

Initialisierung

  • basisverzeichnis_festlegen: Festlegen des Basisverzeichnisses
  • arbeitsverzeichnisse_erstellen: Im Basisverzeichnis werden die Arbeitsverzeichnisse angelegt
  • programmerkennung: Erkennung der notwendigen Helferprogramme
  • variablenzuweisungen: zur besseren Lesbarkeit des Scriptes
  • konfiguration: X.ini für ProjectX anlegen und einige Werte vordefinieren
  • loeschen_temporaere_arbeitsordner: Definierten Anfangszustand herstellen

Hauptmenue

Mit Aufruf der Funktion hauptmenue () wird ein Aufgabenbereich gewählt. Entspechend dieses Aufgabenbereiches wird zu den Untermenues verzweigt.

Untermenues

untermenue_video_dvd

Fernsehaufnahme schneiden und als Video-DVD brennen

  • filmauswahl_dvd: Das gewünschte Videofile wird geladen
  • pjx_demux_gui: und mit ProjectX geschnitten und demultiplext
  • requantisieren: Passt der Film nicht auf eine DVD wird er requantisiert
  • multiplexen: Bild und Ton werden nun wieder gemultiplexed.
  • authoring_ohne_menue: Vom mpg-file wird die DVD-Struktur erstellt,
  • abspielen: noch einmal einer "Sichtprüfung" (mit optionaler Screenshot-Möglichkeit) unterzogen,
  • brennen_video_dvd: um danach als Video-DVD gebrannt zu werden.

Fernsehaufnahme schneiden und DVD-Struktur in Datei sichern

  • filmauswahl_dvd: Das gewünschte Videofile wird geladen
  • pjx_demux_gui: und mit ProjectX geschnitten und demultiplext
  • requantisieren: Passt der Film nicht auf eine DVD wird er requantisiert
  • multiplexen: Bild und Ton werden nun wieder gemultiplexed.
  • authoring_ohne_menue: Vom mpg-file wird die DVD-Struktur erstellt,
  • abspielen: noch einmal einer "Sichtprüfung" (mit optionaler Screenshot-Möglichkeit) unterzogen,
  • sichern_dvd_struktur: um nun im Sicherungsverzeichnis gespeichert zu werden

DVD-Struktur brennen

  • verzeichnisauswahl_dvd: Aus dem Sicherungsverzeichnis wird eine gespeicherte DVD-Struktur geladen.
  • abspielen: noch einmal einer "Sichtprüfung" (mit optionaler Screenshot-Möglichkeit) unterzogen,
  • brennen_video_dvd: um danach als Video-DVD gebrannt zu werden.

untermenue_ts

Fernsehaufnahme schneiden, TS als Daten-DVD brennen

  • filmauswahl_ts: Das gewünschte Videofile wird geladen
  • pjx_ts_gui: und mit ProjectX geschnitten und gewandelt nach TS,
  • brennen_ts: um danach als Daten-DVD gebrannt zu werden

Fernsehaufnahme schneiden, TS sichern

  • filmauswahl_ts: Das gewünschte Videofile wird geladen
  • pjx_ts_gui: und mit ProjectX geschnitten und gewandelt nach TS,
  • sichern_ts: um nun im Sicherungsverzeichnis gespeichert zu werden

gesichertes TS-file als Daten-DVD brennen

  • verzeichnisauswahl_ts: Aus dem Sicherungsverzeichnis wird ein gespeicherter TS-Stream geladen,
  • brennen_ts: um danach als Daten-DVD gebrannt zu werden

untermenue_videoclip

DVB-Clip: Schneiden und speichern (Ton: MP2 normalisiert + AC3)

  • filmauswahl_clip: Der gewünschte Videoclip wird geladen
  • pjx_demux_gui: und mit ProjectX geschnitten und demultiplext
  • normalisieren: Der mp2-Ton wird normalisiert.
  • multiplexen: Bild und Ton werden nun wieder gemultiplexed.
  • sichern_clip: um nun im Videoclip-Verzeichnis gespeichert zu werden

DVB-Clip: Schneiden und speichern (Ton: AC3)

  • filmauswahl_clip: Der gewünschte Videoclip wird geladen
  • pjx_demux_gui: und mit ProjectX geschnitten und demultiplext
  • ac3_behalten: Alle Tonspuren, die nicht "AC3" heißen, werden gelöscht.
  • multiplexen: Bild und Ton werden nun wieder gemultiplexed.
  • sichern_clip: um nun im Videoclip-Verzeichnis gespeichert zu werden

DVB-Clip: Schneiden und speichern (Ton: MP2 normalisiert)

  • filmauswahl_clip: Der gewünschte Videoclip wird geladen
  • pjx_demux_gui: und mit ProjectX geschnitten und demultiplext
  • mp2_behalten: Alle Tonspuren, die nicht "mp2" heißen, werden gelöscht.
  • multiplexen: Bild und Ton werden nun wieder gemultiplexed.
  • sichern_clip: um nun im Videoclip-Verzeichnis gespeichert zu werden

Mpeg1-Clip: Schneiden und speichern (Ton: MP2 normalisiert)

  • filmauswahl_clip: Der gewünschte mpeg1-Videoclip wird geladen
  • pjx_demux_gui: und mit ProjectX geschnitten und demultiplext
  • normalisieren: Der mp2-Ton wird normalisiert.
  • multiplexen: Bild und Ton werden nun wieder gemultiplexed.
  • sichern_clip: um nun im Videoclip-Verzeichnis gespeichert zu werden

Das war's!


Vom DVB zur DVD, ein Wikibuch: Übersicht - Der Weg - Die Helferprogramme - Das Script - Installation - Bedienungsanleitung - Programmieranleitung



Zurück zur Multimedia-Übersicht