|
|
Zeile 1: |
Zeile 1: |
− | {{Dvbscript navigationsbox}}
| + | ==Farbe in der Beschreibung== |
− | In diesem Artikel wird näher darauf eingegangen, wie das Script aufgebaut ist und warum es so funktioniert, wie es funktioniert.
| |
| | | |
− | Dazu habe ich einen Ausdruck der Version 0.5.5 gemacht und dabei festgestellt, daß es ganz schön umfangreich geworden
| + | Wenn ich mir das so anschaue, was ich bis jetzt in diesem Artikel geschrieben habe, dann muß ich leider feststellen, daß eine gewisse Übersichtlichkeit |
− | 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.
| + | fehlt. Die Überschriften (==, ===, ====) bringen nicht so das Ergebnis, das ich mir vorstelle.<br> |
| + | Ich denke, da werde ich demnächst etwas Farbe ins Spiel bringen. Ich muß nur noch erkunden, wie das 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
| + | so long<br> |
− | zum anderen möchte ich selbst nachschauen können, warum ich Schritt x so programmiert habe und nicht anders (Purer Eigennutz also).
| + | --[[Benutzer:Escho|Escho]] 00:42, 17. Jun. 2008 (CEST) |
| | | |
− | Greifen wir es also an und schauen uns zusammen den Aufbau des Scriptes an:
| + | ::So hier zum Beispiel <font color="red"><b>Fettes Rot</b></font> <font color="blue">oder doch nur blau </font> <font color="green">oder grün</font> ? |
| + | ::[[Benutzer:Robi|Robi]] 00:52, 17. Jun. 2008 (CEST) |
| | | |
− | ==<font color="green"> Beschreibung </font>==
| + | ::::Genau so, nur daß ich mir über die Farbgebungen noch nicht ganz im klaren bin, die ich verwenden möchte. Da muß ich noch etwas probieren, |
− | | + | ::::was mir am besten gefällt. Aber erst werde ich diese Anleitung noch fertigstellen, danach erst geht's an's Layout. |
− | In diesem Abschnitt stehen ein paar allgemeine Daten über das Script.
| + | ::::--[[Benutzer:Escho|Escho]] 00:25, 18. Jun. 2008 (CEST) |
− | | |
− | ==<font color="green"> Evt. vom Benutzer anzupassen </font>==
| |
− | | |
− | Folgende Variable können, wenn es sein muß, an die eigenen Gegebenheiten anpepasst werden
| |
− | | |
− | ===Basisverzeichnis===
| |
− | | |
− | Die Variable $basisverzeichnis enthält den Pfad zum sogenannten Basiverzeichnis. In diesem Verzeichnis werden vom Script weitere Arbeitsverzeichnisse angelegt.<br>
| |
− | Default ist: ~/filme<br>
| |
− | Um eine wilde Jongliererei mit Rechten zu umgehen, muß das Basisverzeichis im Heimatverzeichnis des Benutzers liegen. Existiert der Default-Pfad bereits
| |
− | und wird von anderen Anwendungen benutzt, muß in die Variable ein anderer Pfadname eingetragen werden. Aber, wie gesagt, im Heimatverzeichnis bleiben!
| |
− | | |
− | ===DVD-Groesse===
| |
− | | |
− | Die Variable $maxgroesse enthält die Anzahl der Bytes, die auf eine DVD passen. Ist ein Film größer, wird requantisiert.<br>
| |
− | Default ist: 4600000000. Viel mehr passt auf eine DVD5 nicht drauf.<br>
| |
− | Diese Variable sollte nicht angetastet werden, es sei denn, jemand hätte Lust, Funktionen für eine Double-Layer DVD zu programmieren.
| |
− | | |
− | ===Brenngeschwindigkeit===
| |
− | | |
− | In die Variable $brenngeschwindigkeit kann eingetragen werden, mit welcher maximalen Geschwindigkeit die DVD gebrannt werden soll. Ich verwende 16fach
| |
− | DVD's und habe deshalb als Default 8 angegeben. Mit halber Geschwindigkeit dauert es zwar etwas länger, aber ich habe auch noch nie Ausschuss produziert.
| |
− | | |
− | ===Pfade, in denen nach den Helferprogrammen gesucht wird===
| |
− | | |
− | In die Variable $suchpfade sind 4 Pfade als Default eingetragen. In diesen Pfaden sieht das Script nach, ob die notwendigen Helferprogramme installiert
| |
− | sind.
| |
− | | |
− | ==<font color="green"> Fehlermeldungen abschalten </font>==
| |
− | | |
− | Mit exec 2>/dev/null wird die Fehlerausgebe ins Nirwana geschickt. Dadurch werden nur Meldungen, die auch explizit gewollt sind, auf dem Bildschirm
| |
− | ausgegeben.<br>
| |
− | Für die Inbetriebnahme und eine eventuell damit verbundene Fehlersuche empfehle ich, diesen Befehl auszukommentieren.
| |
− | | |
− | ==<font color="green"> Installationsroutine </font>==
| |
− | | |
− | ===Programmnamen===
| |
− | | |
− | Dies sind die Namen der Helferprogramme, die in einer indizierten Variablen abgelegt werden.
| |
− | | |
− | ===Anlegen der notwendigen Verzeichnisse===
| |
− | | |
− | Das Basisverzeichnis wird angelegt. Und im Basiverzeichnis werden folgende Arbeitsordner angelegt:
| |
− | *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_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 mplayer 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:
| |
− | | |
− | *'''for...''': Diese Schleife wird neunmal durchlaufen, so oft also, wie Helferprogramme vorhanden sind ($name[0] bis $name[8]). Alles folgende spielt sich in der Schleife ab.
| |
− | *'''pfad[i]='cat....''': Der zum jeweiligen Programm gehörige Pfad wird, so er im Default-Verzeichnis vorhanden ist, von dort in die indizierte Variable $name(i) geschrieben.
| |
− | *'''if...''': Wenn das jeweilige Programm nicht existiert,dann
| |
− | *'''then''': wird mit dem Befehl "find" das Dateisystem (in den Suchpfaden) nach dem Programm durchsucht. Anschließend wird mit "wc -w" die Anzahl der gefundenen Programme ermittelt (Es können ja mehrere Versionen des gleichen Programmes installiert sein oder das gleiche Programm in unterschiedlichen Pfaden).
| |
− | *'''case 0''': Anzahl 0, das Programm wurde nicht gefunden. Es folgt ein Hinweis darauf. Danach wird das Script beendet und das Programm muß nachinstalliert werden.
| |
− | *'''case 1''': Anzahl 1, das Programm existiert genau einmal. Der dazugehörige Pfad wird als Default in das Default-Verzeichnis geschrieben.
| |
− | *'''case *''': Das Programm existiert mehr als einmal. Es wird nachgefragt (kdialog --combobox), welcher der Pfade als Default 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.
| |
− | | |
− | ==<font color="green"> 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
| |
− | 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.
| |
− | | |
− | ==<font color="green"> Konfiguration PJX </font>==
| |
− | | |
− | Hier werden die Initialisierungsdateien festgelegt, in denen Einstellungen stehen, mit denen ProjectX startet:
| |
− | | |
− | ===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<br>
| |
− | | |
− | *'''WindowPosition.Main.Heigh/Width''': Größe des PJX-Fensters
| |
− | *'''WindowPosition.Main.X/Y''': Position des Fensters (hier rechts oben)<br>
| |
− | | |
− | *'''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
| |
− | | |
− | ===X.ini für Videoclips===
| |
− | | |
− | Die X.ini.clip enthält zusäthlich:
| |
− | | |
− | *'''AudioPanel.decodeMPGAudio=1''': Die mpeg-audio-Dateien werden zu .wav decodiert (Für's spätere Normalisieren des Tons notwendig)
| |
− | | |
− | Diese beiden X.ini's werden als Default im Default-Verzeichnis abgelegt, von wo sie bei Bedarf geladen werden.
| |
− | | |
− | Werden im PJX-Fenster irgendwelche Einstellungen verändert, so werden diese Änderungen nicht in die jeweilige 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'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>==
| |
− | | |
− | Diese Funktionen werden vom Hauptprogrmm nach Bedarf aufgerufen und bilden das eigentliche Gerüst des Scriptes. Wird von einer Funktion erwartet, daß sie einen
| |
− | Wert an das Hauptprogramm übergeben soll, dann wird das durch den Befehl "echo Variable" am Ende der Funktion realisiert.
| |
− | | |
− | ===<font color="olive"> del_ordner () </font>===
| |
− | | |
− | Die Inhalte der Arbeitsordner $tmp_pfad und $dvd-struktur_pfad werden gelöscht
| |
− | | |
− | ===<font color="olive"> fehler () </font>===
| |
− | | |
− | Wurde keine Datei film.mpg gefunden, so wurde auch nichts multiplext. In diesem Fall muß irgendwo ein Fehler passiert sein. Es erfolgt ein Hinweis auf
| |
− | diese Tatsache. Anschließend wird das Script beendet.
| |
− | | |
− | ===<font color="olive"> aktionenauswahl </font>()===
| |
− | | |
− | Mit Hilfe des Befehls "kdialog --radiolist" wird eine Liste generiert, aus der man durch (virtuellen) Knopfdruck auswählen kann, welche der angebotenen
| |
− | Aktionen ausgeführt werden sollen. Die zu der Aktion gehörige Nummer wird in der Variablen $was_tun abgelegt. Diese Variable wird dann mit "echo $was_tun" der
| |
− | Nachwelt zur Verfügung gestellt. Diese Nachwelt, nämlich das Hauptprogramm, fragt die Variable ab und führt dann die für diese Aufgabe notwendigen Funktionen
| |
− | aus.
| |
− | | |
− | ===<font color="olive"> filmauswahl () </font>===
| |
− | | |
− | Der Befehl "kdialog --getopenfilename" öffnet ein KDE-Fenster, in dem aus einer Liste eine Datei zur weiteren Verarbeitung ausgewählt werden kann. Diese
| |
− | Datei wird in die Variable $quelldatei geschrieben. Als Liste werden die im $aufname_pfad enthaltenen Dateien hergenommen.
| |
− | | |
− | Die folgende "if"-Abfrage beendet das Script, wenn im Dialog die Taste Abbrechen gedrückt wurde.
| |
− | | |
− | ===<font color="olive"> verzeichnisauswahl() </font>===
| |
− | | |
− | Hier gilt das bei der Funktion "filmauswahl ()" gesagte. Der Unterschied besteht darin, daß nicht eine Liste von Dateien, sondern eine Liste von Ordnern zur
| |
− | Auswahl gestellt wird. Diese Ordner befinden sich im Verzeichnis $sicherungs_pfad.
| |
− | | |
− | ===<font color="olive"> pjx_demux_gui () </font>===
| |
− | | |
− | Das Programm ProjectX wird aufgerufen mit folgenden Einstellungen:
| |
− | | |
− | *'''-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.
| |
− | | |
− | ===<font color="olive"> pjx_ts_gui () </font>===
| |
− | | |
− | Es gilt das oben Gesagte mit folgenden Änderungen:
| |
− | | |
− | *'''-tots''': Der Film wird nicht demultiplext, sondern als TS-File gewandelt
| |
− | *'''-split 4300''': Bei 4300 Mbyte wird die Aufnahme gesplittet (mehr passt nicht auf eine DVD drauf)
| |
− | | |
− | ===<font color="olive"> pjx_clip () </font>===
| |
− | | |
− | *'''-ini''': Als Initialisierungsdatei wird X.ini.clip verwendet, in der festgelegt wird, daß das mpg-audio zu einer wav-Datei decodiert wird.
| |
− | | |
− | ===<font color="olive"> mpeg1_input () </font>===
| |
− | | |
− | Ein mpeg1-Video wird mit Hilfe von "ffmpeg" demultiplext. Dabei wird der Ton zu .wav decodiert. Die Optionen des Befehls im einzelnen:
| |
− | | |
− | *'''-i ${quelldatei}''': Dieser mpeg1-Viedeo-Clip wird verarbeitet
| |
− | *'''${tmp_pfad}/film.mp2.wav''': In diese Datei wird der Ton decodiert (als .wav-File)
| |
− | *'''-vcodec copy''': Das Videofile wird nicht verändert.
| |
− | *'''${tmp_pfad}/film.m1v''': Hier ist dann das demultiplexte Videofile zu finden
| |
− | | |
− | ===<font color="olive"> requantisieren () </font>===
| |
− | | |
− | 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 den "Stauchfaktor", also um wieviel mal das Ausgangsmaterial kleiner gemacht werden soll, bekommt von uns den Namen
| |
− | "Requantisierungsfaktor".
| |
− | | |
− | Es macht natürlich wenig Sinn, ein Audiofile verkleinern zu wollen. Das Viedofile mit seinen etlichen GByte's Größe bietet hier mehr Aussicht auf Erfolg. Also
| |
− | werden wir nur das Videofile requantisieren.
| |
− | | |
− | 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
| |
− | | |
− | ====audiosumme====
| |
− | audio_summe=`du -bc ${tmp_pfad}/*.ac3 ${tmp_pfad}/*.mp2 | cut -f1 | tail -n 1`
| |
− | Im Prinzip das gleiche wie oben, nur daß nun von allen Audiofiles die Grösse bestimmt wird (*.ac3 *.mp2). Das Ergebnis ist die Gesamtsumme der Audiofiles, wieder als bloße Zahl.
| |
− | | |
− | ====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 Summe aller Video- und Audiofiles.
| |
− | | |
− | ====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
| |
− | Diese Nachwelt ist die Variabele $requantisierungsfaktor, der das Ergebnis der Berechnung mit Hilfe er sogenannten Substitution (`....`) übergeben 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 Requantisierung übersprungen. Ist sie nicht größer, wird
| |
− | requantisiert.
| |
− | | |
− | ====Die Requantisierung====
| |
− | ${tcrequant} -d2 -i ${tmp_pfad}/film.m2v -o ${tmp_pfad}/film.requant -f ${requantisierungsfaktor}
| |
− | *'''-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
| |
− | | |
− | Was noch folgt ist eine Namensänderung der Datei film.requant zu film.m2v (mv ...) und das Löschen von film.requant. Die Namensänderung ist übrigens notwendig,
| |
− | weil die Funktion "multiplex ()" das Videofile unter dem Namen film.m2v erwartet.
| |
− | | |
− | ===<font color="olive"> normalisieren () </font>===
| |
− | | |
− | 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
| |
− | beschwert hätten. 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 aber so vor, daß diese Individualität dadurch zum Ausdruck gebracht wird,
| |
− | das jeder Sender mit einer anderen Lautstärke sein Programm 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.
| |
− | | |
− | Die normalisierte Datei überschreibt und ersetzt in diesem Fall die Ausgangsdatei. Die Option -v zaubert dabei etwas Bearbeitungsfortschritt auf den Bildschirm.
| |
− | | |
− | 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 sebstvertändlich ein Player, der dies Auswertung auch verarbeiten
| |
− | kann.
| |
− | Dies nur zur Information, daß es noch eine Welt ausßerhalb von mp2 gibt.
| |
− | | |
− | 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
| |
− | 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
| |
− | Mitteleuropäer wird also zufrieden sein mit der Qualität seines Bearbeitungsergebnisses.
| |
− | | |
− | ===<font color="olive"> encode2mp2 () </font>===
| |
− | ${ffmpeg} -i ${tmp_pfad}/film.mp2.wav -acodec mp2 -ab 192k ${tmp_pfad}/film.mp2 2>&1
| |
− | *'''-i ${tmp_pfad}/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
| |
− | *'''2>&1''': Damit kann man am Bildschirm verfolgen, was gerade passiert
| |
− | | |
− | ===<font color="olive"> multiplexen () </font>===
| |
− | 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, die ein "m1v" im Namen enthalten, geschrieben
| |
− | Dass gleiche geschieht mit den Variablen mpeg2_viedo, mp2_audio und ac3_audio. Ist im tmp_pfad zum Beispiel keine AC3-Datei vorhanden, so 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}''': /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.
| |
− | | |
− | ===<font color="olive"> authoring_ohne_menue () </font>===
| |
− | Hier wird der einfachste Fall einer DVD-Struktur erzeugt (ohne DVD-Menue).
| |
− | ${dvdauthor} -o ${dvdstruktur_pfad} -t ${tmp_pfad}/film.mpg 2>&1
| |
− | *'''${dvdauthor}''': /usr/bin/dvdauthor (Programmaufruf)
| |
− | *'''-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
| |
− | | |
− | ===<font color="olive"> brennen_video_dvd () </font>===
| |
− | 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}''': Programmaufruf (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''': Burn an initial session to the selected device (so stehts in der man-page). Was immer das auch bedeuten mag. auf jeden Fall funktioniert es prima mit dieser Option.
| |
− | *'''-dvd-video''': udf-Filesystem für Video-DVD's
| |
− | *'''${brenn_pfad}''': Was hier drin steht, wird gebrannt
| |
− | *'''2>&1''': Damit kann man am Bildschirm verfolgen, was gerade passiert
| |
− | | |
− | ===<font color="olive"> brennen_ts () </font>===
| |
− | Brennen des TS-Files als Daten-DVD
| |
− | ====Wieviele DVD's sind notwendig?====
| |
− | 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.
| |
− | | |
− | ====Das Brennen====
| |
− | 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)))"* 2>&1
| |
− | *'''${growisofs}''': Programmaufruf (z.B. /usr/bin/growisofs)
| |
− | *'''-speed=${brenngeschwindigkeit}''': maximale Brenngeschwindigkeit
| |
− | *'''-Z /dev/dvd''': siehe Funktion brennen_video_dvd ()
| |
− | *'''-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
| |
− | *'''2>&1''': Damit kann man am Bildschirm verfolgen, was gerade passiert
| |
− | | |
− | ===<font color="olive"> sichern_struktur () </font>===
| |
− | Diese Funktion sichert die DVD-Struktur
| |
− | sicherungsordner=$(date +%Y%m%d%H%M%S)
| |
− | 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
| |
− | | |
− | ===<font color="olive"> sichern_ts () </font>===
| |
− | Diese Funktion sichert die TS-files
| |
− | sicherungsordner=$(date +%Y%m%d%H%M%S)
| |
− | 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
| |
− | | |
− | ===<font color="olive"> clip_speichern () </font>===
| |
− | Diese Funktion speichert einen Videoclip
| |
− | clipspeicher=`kdialog --title "$quelldatei" --getsavefilename /Videoclips/Archiv`
| |
− | *'''kdialog''': Programmaufruf (z.B. /usr/bin/kdialog)
| |
− | *'''--title "$quelldatei"''': Überschrift für das KDE-Fenster
| |
− | *'''--getsavefilename''': Generiert ein KDE-Fenster, in dem
| |
− | | |
− | | |
− | '''will be continued'''
| |
− | | |
− | | |
− | | |
− | | |
− | | |
− | | |
− | | |
− | {{Dvbscript navigationsbox}}
| |
− | ----
| |
− | [[Multimedia|Zurück zur Multimedia-Übersicht]]
| |
− | [[Category:Multimedia]]
| |