Projectx oder vom DVB zur DVD part 2

Aus Linupedia.org
Version vom 6. November 2009, 20:17 Uhr von Escho (Diskussion | Beiträge) (Beginn der Beschreibung des Scripts)
Wechseln zu: Navigation, Suche
Höhe=24px
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


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

Die Erklärung zum Requantisieren habe ich aus der Programmieranleitung im dritten Teil der Tetralogie hirher kopiert und entsprechend angepasst:

Wie wird requantisiert

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.


Links

In der Artikelübersicht ist eine ausführliche Linkliste enthalten: vom DVB zur DVD: Vorstellung der Wiki-Artikel in dieser Serie


Zurück zur Multimedia-Übersicht