Projectx oder vom DVB zur DVD part 2

Aus Linupedia.org
Version vom 9. Januar 2011, 15:14 Uhr von Escho (Diskussion | Beiträge) (export VIDEO_FORMAT=PAL)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

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 und ist damit so aktuell, wie es nur sein kann
  • Wenn das Bearbeitungsergebnis nicht auf eine einzige DVD passt, wird das Videofile requantisiert
  • Das Brennen wird automatisch angestossen
  • Es werden auch ac3-Tondateien verarbeitet (Dolby digital)

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
    • Installation: Muß heruntergeladen und Kompiliert werden
    • Anleitung zur Installation: Weiter unten im Artikel
  • 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: packman

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 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 von PJX zu kommen:

cd ~/Project-X

Hiermit die Programmdatei erstellen

sh build.sh

Diese Programmdatei befindet sich nun im Installationsordner:

~/Project-X/ProjectX.jar

Ausführbar machen

Die Programmdatei muß ausführbar gemacht werden:

  • Rechtsklick auf ~/Project-X/ProjectX.jar
    • Eigenschaften
    • Berechtigungen
    • Bei Ausführbar das Kreuz machen

Weitere Infos

Detailliertere Informationen zur CVS-Version von ProjectX habe ich in diesem Wiki-Artikel zusammengefasst

Das Script

#!/bin/bash
 
#++++++++++++++++++++++ProjectX oder vom DVB zur DVD+++++++++++++++++++++++++++++++

#+++++++++++++++++++++++++++++Definition+++++++++++++++++++++++++++++++++++++++++++

export VIDEO_FORMAT=PAL

#++++++++++++++++++++++++++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

Definition

Das Videoformat wird auf PAL festgelegt

Ordnerstruktur erzeugen

Es werden ein Basisverzeichnis und notwendige Arbeitsordner erzeugt. Der Name des Basisverzeichnisses lautet:

~/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 deshalb von der GUI nicht mehr explizit um Zustimmung gebeten.

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. So behält man einfacher den Überblick über die Schnittpunkte.

WindowPosition.Main.Width=9999
WindowPosition.Main.Y=0
     Damit läuft ProjectX de facto als Vollbild.

OptionPanel.NormalLog=0
     Es wird keine Logdatei mitgeschrieben, da die nur stören würde.

OptionPanel.closeOnEnd=1
     Wenn ProjectX mit seinen Aufgaben fertig ist, beendet es sich selbst. Das Script läuft dadurch automatisch weiter.

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 ]
then
     .....
fi

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
     Dieses Video-File wird requantisiert

~/dvbscript_2/cache/film.requant
     Und das hier ist das Ergebnis, also das gestauchte File

-f ${requantisierungsfaktor}
     Um diesen Faktor, wird das Video-File verkleinert

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

Es werden leere Variablen angelegt für die Video-, die ac3- und die mp2-Tondateien. Das muß sein, damit mplex später nicht meckert.

mpeg2_video=
mp2_audio=
ac3_audio=


Nun werden die Video- und Audio-Files gesucht

mpeg2_video=`find ~/dvbscript_2/cache | grep "m2v"`
mp2_audio=`find ~/dvbscript_2/cache | grep "mp2"`
ac3_audio=`find ~/dvbscript_2/cache | grep "ac3"`
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


Das eigentliche Multiplexen:

/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 ein paar Infos in die Konsole schreiben, wenn es loslegt

-f8
     Das Multiplexen erfolgt in größter Annäherung an den DVD-Standard

$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, so wie des der Standard für die Video-DVD erfordert

~/dvbscript_2/ergebnis
     Was hier drin steht, wird auf die DVD gebrannt

Bedienungsanleitung

Bedienoberfläche von ProjectX
  • Aufnahme mit kaffeine
  • leere DVD einlegen
  • 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 links 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.

Ausschau

Dieses Script wird weiterentwickelt im dritten Teil der Tetralogie und erhält im vierten Teil sogar eine Bedienoberfläche.

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