Projectx oder vom DVB zur DVD part 2
Achtung dieser Artikel ist noch in Arbeit und dient vorläufig nur als Vorlage. Dieser Beitrag zu Linux oder der Abschnitt ist in Bearbeitung. Weitere Informationen findest du hier. Der Ersteller arbeitet an dem Beitrag oder Abschnitt und entsorgt den Wartungsbaustein spätestens 3 Tage nach der letzten Bearbeitung. Änderungen außer Rechtschreibkorrekturen ohne Absprache mit dem Urspungsautor sind möglichst zu vermeiden, solange dieser Baustein noch innerhalb der genannten Frist aktiviert ist. |
Dies ist der zweite Artikel der Tetralogie "vom DVB zur DVD".
Es wird gezeigt, wie die im ersten Artikel vorgestellte Methode zur Videoverarbeitung weiter vereinfacht werden kann. Dabei wird ProjectX in seiner aktuellen CVS-Version verwendet.
Diese Beschreibung wurde mit folgenden Distributionen getestet: |
Opensuse 11.1 32Bit mit KDE 4.x |
Inhaltsverzeichnis
- 1 Vorwort
- 2 Welche Programme sind nötig?
- 3 ProjectX
- 4 Das Script
- 5 Beschreibung des Scriptes
- 6 Links
Vorwort
Dieser Artikel baut auf dem ersten Teil der Tetralogie auf. Es wird als vorausgesetzt, daß dieser erste Wiki-Artikel auch gelesen wurde. Folgende signifikanten Änderungen habe ich vorgenommen:
- ProjectX wird in der CVS-Version verwendet.
- Das Videofile wird nötigenfalls requantisiert
- Das Brennen wird automatisch angestossen
- Es werden auch ac3-Tondateien verarbeitet (Dolby-Sourround)
Welche Programme sind nötig?
- kaffeine: Aufnahme und Wiedergabe (Installation mit Yast, Repository: packman)
- libxine1: Player-Engine, Packman-Version von xine (Installation mit Yast, Repository: packman)
- ProjectX: Schnitt, Synchronisation, Fehlerbereinigung, Demultiplexen (Muss selbst kompiliert werden und zwar so: projectx )
- tcrequant: Requantisieren (Installation mit Yast, Paketname: transcode (ab Version 1.1.5), Repository: packman)
- mplex: Multiplexen (Installation mit Yast, Paketname: mjpegtools, Repository: packman)
- dvdauthor: Kommandozeilentool für das Authorn von DVDs (Installation mit Yast, Repository: packman)
- growisofs: Kommandozeilentool für das Brennen (Installation mit Yast, Paketname: dvd+rw-tools, Repository: packman)
- kdialog: Graphische Dialoge über die Kommandozeile (Installation mit Yast, Repository: OSS)
ProjectX
ProjectX ist ein geniales Programm, um einen DVB-Stream für die Weiterverarbeitung zur Video-DVD vorzubereiten. Die Bedienung ist zwar etwas gewöhnungsbedürftig, was aber hauptsächlich an den vielfältigen Optionen liegen dürfte, die das Programm anbietet. Beläßt man es jedoch bei den Standardeinstellungen, fährt man im allgemeinen gar nicht so schlecht.
Vier Eigenschaften lassen das Tool für den angedachten Verwendungszweck besonders geeignet erscheinen.
Fehlerbereinigung
Kaum eine DVB-Aufnahme wird frei von Fehlern sein. Solche Fehler, wie zum Beispiel Dropouts, werden von ProjectX automatisch beim Demultiplexen so bereinigt, daß sie bei der DVD-Erstellung nicht mehr stören.
Synchronisieren von Audio und Video
Werden die Rohdaten eines DVB-Streams abgespielt, so wird man feststellen, daß ein Zeitversatz zwischen Bild und Ton vorhanden ist. Ein bis zwei Sekunden sind hier keine Seltenheit. Kommen noch Störungen durch Übertragungsfehler dazu, wird darüber hinaus dieser Zeitversatz über den gesamten Film nicht konstant sein. ProjectX beseitigt beim Demultiplexen automatisch den Zeitversatz.
Schneiden des DVB-Streams
Ein DVB-Stream setzt sich prinzipiell aus immer wiederkehrenden Bildergruppen (GOP - group of pictures) unterschiedlichen Inhalts zusammen. Ein solches GOP besteht aus verschiedenen Arten von Frames (Einzelbildern). Vereinfacht läßt sich sagen:
- Ein I-Frame enthält ein komplettes komprimiertes Bild.
- Ein P-Frame enthält die Änderungen zum I-Frame.
- Ein B-Frame füllt die Lücken.
Damit könnte ein GOP so aussehen: I B B B P B B B P B B B
Es wird ersichtlich, daß ein Schneiden des Streams zeitsparend nur an den I-Frames, also in unserem Beispiel an jedem zwölften Einzelbild möglich ist. Schneidet man am den P- oder B-Frames, ist eine mehr oder weniger aufwändige Neucodierung erforderlich, die in der Regel viel Zeit benötigt.
ProjectX bietet die Möglichkeit, an den I-Frames zu schneiden. Das ist für den Heimanwender zur Beseitigung von Werbung ausreichend genau.
Installation der CVS-Version
Für diese Version existieren keine RPMs, sie muß also selbst heruntergeladen und kompiliert werden
Herunterladen
Zum Herunterladen ist das Tool "CVS" erforderlich (Falls noch nicht vorhanden, vorher mit Yast installieren).
In einer Konsole wird danach folgender Befehl eingegeben:
cvs -z3 -d:pserver:anonymous@project-x.cvs.sourceforge.net:/cvsroot/project-x co -P Project-X
Dadurch wird im Heimatverzeichnis des Users ein Ordner mit dam Namen "Project-X" erstellt, der die notwendigen Dateien aus dem CVS-Repository enthält.
Kompilieren
Folgende Anweisung in eine Konsole hacken, um in den Installationsordner zu kommen:
cd ~/Project-X
Hiermit die Installation durchführen:
sh build.sh
Damit befindet sich nun im Installationsordner die eigentliche Programmdatei von PJX.
Das Script
#!/bin/bash #++++++++++++++++++++++ProjectX oder vom DVB zur DVD+++++++++++++++++++++++++++++++ #++++++++++++++++++++++++++Ordnerstruktur erzeugen+++++++++++++++++++++++++++++++++ if [ ! -e ~/dvbscript_2 ] then mkdir ~/dvbscript_2 mkdir ~/dvbscript_2/cache mkdir ~/dvbscript_2/ini mkdir ~/dvbscript_2/ergebnis fi #++++++++++++++++++++++++++++++++++++++++X.ini+++++++++++++++++++++++++++++++++++++ echo \ "# Application Application.Agreement=1 Application.Language=de # CollectionPanel CollectionPanel.Preview.SliderWidth=0 # WindowPosition WindowPosition.Main.Width=9999 WindowPosition.Main.Y=0 # OptionPanel OptionPanel.NormalLog=0 OptionPanel.closeOnEnd=1" \ > ~/dvbscript_2/ini/X.ini #++++++++++++++++++++++++++Arbeitsordner leeren++++++++++++++++++++++++++++++++++++ rm ~/dvbscript_2/cache/* rm ~/dvbscript_2/ergebnis/VIDEO_TS/* rmdir ~/dvbscript_2/ergebnis/VIDEO_TS rmdir ~/dvbscript_2/ergebnis/AUDIO_TS #++++++++++++++Quelledatei auswählen, schneiden und demultiplexen+++++++++++++++++++ java -jar ~/Project-X/ProjectX.jar -demux -gui -ini ~/dvbscript_2/ini/X.ini -out ~/dvbscript_2/cache -name film #++++++++++++++++++++++++++++++++++Requantisieren+++++++++++++++++++++++++++++++++++ dvdgroesse=4600000000 filmgroesse=`du -bc ~/dvbscript_2/cache/* | cut -f1 | tail -n 1` if [ $filmgroesse -ge $dvdgroesse ] then videogroesse=`du -bc ~/dvbscript_2/cache/*.m2v | cut -f1 | tail -n 1` audiogroesse=`du -bc ~/dvbscript_2/cache/*.ac3 ~/dvbscript_2/cache/*.mp2 | cut -f1 | tail -n 1` requantisierungsfaktor=`echo "scale=8 ; ${videogroesse}/$((dvdgroesse-audiogroesse))*1.04" | bc` /usr/bin/tcrequant -d 2 -i ~/dvbscript_2/cache/film.m2v -o ~/dvbscript_2/cache/film.requant -f ${requantisierungsfaktor} mv ~/dvbscript_2/cache/film.requant ~/dvbscript_2/cache/film.m2v fi #++++++++++++++++++++++++++++++++Multiplexen++++++++++++++++++++++++++++++++++++++++ mpeg2_video= mp2_audio= ac3_audio= mpeg2_video=`find ~/dvbscript_2/cache | grep "m2v"` mp2_audio=`find ~/dvbscript_2/cache | grep "mp2"` ac3_audio=`find ~/dvbscript_2/cache | grep "ac3"` /usr/bin/mplex -v1 -f8 -o ~/dvbscript_2/cache/film.mpg $mpeg2_video $ac3_audio $mp2_audio #+++++++++++++++++++++++++++++++++Authorn++++++++++++++++++++++++++++++++++++++++++++ /usr/bin/dvdauthor -o ~/dvbscript_2/ergebnis -t ~/dvbscript_2/cache/film.mpg /usr/bin/dvdauthor -o ~/dvbscript_2/ergebnis -T #++++++++++++++++++++++++++++++++++Brennen+++++++++++++++++++++++++++++++++++++++++++ /usr/bin/growisofs -speed=8 -dvd-compat -Z /dev/dvd -dvd-video ~/dvbscript_2/ergebnis #+++++++++++++++++++++++++++++++Script Ende++++++++++++++++++++++++++++++++++++++++++ kdialog --msgbox "ende" exit 0
Beschreibung des Scriptes
Ordnerstruktur erzeugen
Es werden ein Basisverzeichnis und die darin befindlichen Arbeitsordner erzeugt. Der Basisname lautet nun
~/dvbscript_2.
X.ini
Die Initialisierungsdatei für ProjectX wird erzeugt und in den entsprechenden Arbeitsordner geschrieben. Die Optionen bedeuten:
Application.Agreement=1 Wir erklären uns mit den Lizensbestimmungen von ProjectX einverstanden und werden auch nicht mehr danach gefragt. Application.Language=de Die Sprache in ProjectX ist, wo es geht, Deutsch. CollectionPanel.Preview.SliderWidth=0 Der Vorschau-Slider ist genauso lang wie das Vorschaufenster breit ist WindowPosition.Main.Width=9999 WindowPosition.Main.Y=0 Damit läuft ProjectX de facto als Vollbild. OptionPanel.NormalLog=0 Es wir keine Logdatei mitgeschrieben, da die nur stören würde. OptionPanel.closeOnEnd=1 Wenn ProjectX mit seinen Aufgaben fertig ist, beendet es sich selbst, damit das Script automatisch weiterlaufen kann.
Arbeitsordner leeren
Um unerwünschten Ergebnissen vorzubeugen, werden alle Arbeitsordner geleert.
Quelledatei auswählen, schneiden und demultiplexen
Dazu wird diesmal ProjectX in der CVS-Version verwendet.
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:
Das passt maximal auf die DVD
dvdgroesse=4600000000
Die Variable dvdgroesse wird mit der Anzahl der Bytes belegt, die maximal auf die DVD passen (ca.)
So gross ist der Film, wenn er aus ProjectX kommt
filmgroesse=`du -bc ~/dvbscript_2/cache/* | cut -f1 | tail -n 1`
du Bashprogramm, welches den Platzverbrauch von Dateien schätzt -b Ausgabe der Dateigröße in Byte -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) ~/dvbscript_2/cache/* Von den Dateien im Cacheordner soll die Gesamtgroesse ermittelt werden. 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 filmgroesse=`....` Diese Groesse wird in die Variable $filmgroesse geschrieben
Muß requantisiert werden
if [ $filmgroesse -ge $dvdgroesse ]
Wenn die berechnete Grösse des Film die Kapazität der DVD (dvdgroesse) überschreitet, dann wird requantisiert.
Die Grösse des Video-Files
videogroesse=`du -bc ~/dvbscript_2/cache/*.m2v | cut -f1 | tail -n 1`
Nach dem gleichen Prinzip wie oben bei der filmgroesse wird nun die Grösse des Video-Files berechnet (.m2v)
Die Grösse der Audio-Files
audiogroesse=`du -bc ~/dvbscript_2/cache/*.ac3 ~/dvbscript_2/cache/*.mp2 | cut -f1 | tail -n 1`
Die Variable audiogroesse erhält die Gesamtgröße aller Audio-files (.ac3 und .m2v)
Berechnung des Requantisierungsfaktors
requantisierungsfaktor=`echo "scale=8 ; ${videogroesse}/$((dvdgroesse-audiogroesse))*1.04" | bc`
bc Nun ist er endlich da, unser Taschenrechner ${videogroesse}/$((dvdgroesse-audiogroesse))*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
Ausführen der Requantisierung
/usr/bin/tcrequant -d 2 -i ~/dvbscript_2/cache/film.m2v -o ~/dvbscript_2/cache/film.requant -f ${requantisierungsfaktor}
/usr/bin/tcrequant Das Tool tcrequant wird aufgerufen. -d 2 Es wird aufgefordert, bei der Arbeit etwas von dem zu erzählen, was es gerade tut (funktioniert im Moment nur eingeschränkt) -i ~/dvbscript_2/cache/film.m2v Es ist das Video-Vile, das requantisiert werden soll. ~/dvbscript_2/cache/film.requant Das hier ist Name und Pfad des gestauchten Viedeo-Files. -f ${requantisierungsfaktor} Und das hier ist der Faktor, um den das file gestaucht wird
Sichern des Ergebnisses
mv ~/dvbscript_2/cache/film.requant ~/dvbscript_2/cache/film.m2v
Das alte Video-File wird mit dem neuen Video-File überschrieben.
Multiplexen
mpeg2_video= mp2_audio= ac3_audio=
Es werden leere Variablen angelegt für die Video-, die ac3- und die mp2-Tondateien
mpeg2_video=`find ~/dvbscript_2/cache | grep "m2v"`
find Suche Dateien ~/dvbscript_2/cache im Cache-Ordner grep "m2v" die im Namen ein m2v enthalten, also Video-Dateien mpeg2_video=`....` und schreibe die Namen und Pfadangaben der Dateien in diese Variable
Analoges geschieht mit den Ton-Dateien
/usr/bin/mplex -v1 -f8 -o ~/dvbscript_2/cache/film.mpg $mpeg2_video $ac3_audio $mp2_audio
/usr/bin/mplex Starte mplex -v1 Das Programm soll uns wenigstens seinen Namen in die Konsole schreiben, wenn es loslegt -f8 Das Multiplexen erfolgt in größter annäherung an den DVD-Standars $mpeg2_video $ac3_audio $mp2_audio Die Bild- und Ton-Dateien, die in den Variablen vermerkt sind, werden multiplext ~/dvbscript_2/cache/film.mpg Und das ist, was bei der Sache herauskommt
Authorn
/usr/bin/dvdauthor -o ~/dvbscript_2/ergebnis -t ~/dvbscript_2/cache/film.mpg
/usr/bin/dvdauthor Starte dvdauthor -o ~/dvbscript_1/ergebnis und sage ihm, wohin es die DVD-Struktur schreiben soll -t Die DVD enthält nur einen einzigen Titel (ich beschränke mich auf einen Film pro DVD) ~/dvbscript_1/cache/film.mpg Verwende dieses mpg-File als Quelldatei
/usr/bin/dvdauthor -T
/usr/bin/dvdauthor Starte dvdauthor -T und erzeuge die TOC (Inhaltsverzeichnis)
Brennen
/usr/bin/growisofs -speed=8 -dvd-compat -Z /dev/dvd -dvd-video ~/dvbscript_2/ergebnis
/usr/bin/growisofs Starte das Brenntool -speed=8 Es wird mit achtfacher Geschwindigkeit gebrannt -dvd-compat Nach dem Brennen wird die DVD abgeschlossen -Z /dev/dvd Es wird die erste Session auf die DVD gebrannt, die auch die einzige bleiben wird, da die DVD ja abgeschlossen wird -dvd-video Es wird ein UDF-Filesystem generiert, wie des Der Standard für die Video-DVD erfordert ~/dvbscript_2/ergebnis Was hier drin steht, wird auf die DVD gebrannt
Bedienungsanleitung
- Aufnahme mit kaffeine
- leere DVD einegen
- Start des Bash-Scriptes in einem Terminal
- Vom Script wird die CVS-Version von ProjectX gestartet
- Der Reiter Dateiliste muß ausgewählt sein
- Die zu bearbeitende Filmdatei auswählen (Plusknopf links unten)
- Auswahl des Reiters Schnittsteuerung
- Schnittpunkt mit dem Slider oder den Spulknöpfen (Navigation) anfahren
- Schnittpunkt speichern (grünes Plus lins oben im Feld Schnittpunkte)
- Weiter mit dem nächsten Schnittpunkt
- Das Ergebnis kann an dem Farbbalken unter dem Vorschaufenster betrachtet werden (was rot ist, fliegt raus)
- Quickstart drücken
Sollte man vergessen habe, eine leere DVD einzulegen, dann wird im Script das Brennen mit einer Fehlermeldung übersprungen. In diesem Fall kann die fertige DVD-Struktur im Ordner ~/dvbscript_2/ergebnis mit k3b auf DVD gebrannt werden, wie wir es vom ersten Teil der Tetralogie schon gewohnt sind.
Links
In der Artikelübersicht ist eine ausführliche Linkliste enthalten: vom DVB zur DVD: Vorstellung der Wiki-Artikel in dieser Serie