MPEG-4 Kodierung

MPEG-4 kodierte Filme sind platzsparend, und eigenen sich gut um auf CD oder sogar auf Festplatte archiviert zu werden. Mit Hilfe von transocde lassen sich VOB-Dateien leicht in DIVX-Dateien umwandeln, man benötigt noch nicht einmal ein graphisches Tool dafür.

Mit transcode lässt sich recht leicht aus einer beliebigen Video-Quelle ein DivX/XVid File erzeugen. Die hier vorgestellten Kommandos verwenden die offiziellen DivX 5.0.5 Codecs, sollten sich aber analog auch mit den aktuellen XVid Codecs verwenden lassen.

Die folgenden Komamndozeilen werden vollständig mit Hilfe von Shell-Variablen gesteuert. Sie erwarten die Eingabedatei im gleichen Verzeichnis mit dem Namen work.vob, was durchaus auch ein Symlink sein kann.

Hat man, z.B. von einer DVD, mehrere VOB-Dateien, kann man diese mit cat file1.vob file2.vob > zusammen.vob einfach zusammenfassen.

Mit Hilfe von tcprobe -i dateiname lassen sich Details zur angegebene Datei erfahren. Dies funktioniert sowohl für Video- als auch für Audio-Daten.

Shell-Variable

Folgende Shell-Variablen werden verwendet:

$aspect

Die Export-Aspect-Ratio, die im DivX Header gespeichert wird. Leider wird sie von den wenigsten Playern ausgelesen. Es bestehen zwei Möglichkeiten: Man setzt diese Variable grundsätzlich auf 1, was eine 1:1 ASR signalisiert, die tatsächliche ASR muß dann im Player gesetzt werden. Ins gesamt stehen folgende Werte zur Auswahl:

  1. 1:1
  2. 4:3
  3. 16:9
  4. 2.21:1

$audiostream

Die ID des zu extrahierenden Audio-Streams, beginnend bei 0 für den ersten Stream.

$audioparm

Parameter für die Verarbeitung des Audiostreams, grundsätzlich bestehen zwei Möglichkeiten:

$bitrate

Die gewünschte, durchschnittliche Bitrate, in kBit/s.

$crop

Cropping-Parameter, zum abschneiden der "schwarzen Balken". Syntax ist top,left,bottom,right; alternativ vertical,horizontal für symmetrische Schnitte.

$customparm

Beliebige weitere Parameter für die Verarbeitung der Streams. Praktische Beispiele:

$nice

Nice-Level für transcoding-Prozesse. Ich würde dies immer auf 19 setzen, damit nur "übrige" Rechenzeit für die Verarbeitung verwendet wird.

$scale

Skaliert das Zielvideo auf die angegebenen Maße neu, beispielsweise 352x576 für ein DVD-Kompatibles Format.

Vollständiges Beispiel

Eine vollständige Besetzung der Variablen könnte also so aussehen:

audioparm="-b 192,0,5,1 -J normalize"
audiostream=0
aspect=3
bitrate=1200
crop="90,5,88,3"
customparm=
scale=
nice=19

Hilfsmittel zur Ermittlung der Parameter

Die Frage, wie die Parameter zu besetzen sind, stellt sich zurecht. Auch hier stellt Transcode eine ganze Reihe von Möglichkeiten zur Verfügung:

Clipping Detection

Transcode besitzt einen Video-Filter, der den eigentlichen Bildbereich isoliert. Logos von Fernsehsendern (getestet mit allen möglichen Premiere-Sendern) werden dabei ignoriert, so daß der tatsächliche Bildbereich gefunden wird:

transcode -J detectclipping \
-i work.vob \
-c 0:5:00-0:5:30,0:10:00-0:10:30

Nach dem Ende der Ausführung hat man die für den $crop notwendigen Parametersatz.

Interlace Detection

Filme mit Interlacing lassen sich ebenfalls erkennen, auch wenn dieser Filter weniger zuverlässig arbeitet, als die Clipping Detection. Die Ausgabe des Kommandos zeigen alle Video-Frames mit Interlacing an:

transcode --progress_off \
-J 32detect=verbose \
-i work.vob \
-c 0:5:0-0:10:0 \
2>&1 | grep -v "interlaced = no"

moviecalc.xls

Ausgehend von der clipping detection können mit der Tabelle "Div-X Transcoding" aus moviecalc.xls die restlichen Barameter errechnet werden.

Dabei müssen die Abmasse des ursprünglichen Containers, dessen Aspect Ratio (beides mit tcprobe zu ermitteln) und die ermittelten Clipping-Parameter eingetragen werden.

Je nachdem welches Ziel man bei der Kodierung verfolgt, kann nun der entstehende Zielcontainer, dessen Aspect Ratio und eine sinnvolle Bitrate ermittelt werden.

Zum Thema Bitrate einen Hinweis: Die Excel-Tabelle ermittelt den sogenannten "Bits per Pixel"-Wert (BPP), er sollte für MPEG-4 für eine sehr gute Bildqualität sollte eine Bitrate in der Größenordnung von 0,2 bis 0,22 liegen. Grössere Werte bringen keine nennenswerte Verbesserung der Qualität.

Eine Kodierung auf "handliche" CD-Grösse wird von moviecalc nicht unterstützt, dazu gibt es genügend andere Hilfsmittel.

Die eigentliche Umwandlung

Hier bestehen drei Möglichkeiten, von dennen alle jeweils einen Audio-Track mit kodieren. Alle Varianten arbeiten mit 2-Pass-Encoding:

Umrechnung des Filmes in ein 1:1 Seitenverhältnis

Ermittelt man mit Hilfe von moviecalc.xls die eigentliche Aspect Ratio des Filmes, kann man den notwendigen Zielcontainer für eine unverzerrte Ausgabe ohne weitere Hilfsmittel errechnet werden. Dazu muß der Film entsprechend skaliert werden. Folgender Kommandoblock führt die komplette Umrechnung durch:

transcode -i work.vob -V --avi_limit 5000 -nice $nice \
        -j $crop -Z $scale -R 1 -w $bitrate \
        --divx_vbv_prof 3 --a52_drc_off -y divx5,null \
        -a $audiostream $customparm ; \
transcode -i work.vob -o work.avi -V --avi_limit 5000 -nice $nice \
        -j $crop -Z $scale -R 2 -w $bitrate \
        --divx_vbv_prof 3 --a52_drc_off -y divx5 \
        -a $audiostream $audioparm $customparm

Umrechnung des Filmes ohne Skalierung

Dies ist die von mir bevorzugte Variante: Sie schneitet die schwarzen Balken ab, führt aber keine Skalierung durch. Somit entsteht ein Video-Stream mit eine unüblichen Aspect-Ratio, beispielsweise 12:5.

Der Vorteil dieser Lösung liegt darin, daß das Video-Material nicht umgerechnet werden muß; das kann der Player zur Laufzeit machen. Man verliert so keinerlei Video-Informationen, was zur Laufzeit eine bessere Bildqualität liefert.

Der Nachteil liegt im dem fehlenden Kompfort. Die Aspect Ratio muß notiert werden (einfacherweise im Dateinamen), und es wird ein Player benötigt, der die explizite Einstellung einer beliebigen Aspect Ratio ermöglicht. http://www.videolan.org ist ein sehr guter freier Player der dies unterstützt, ebenso der offizielle DivX-Player.

Der Parameter $scale wird hierbei ignoriert.

transcode -i work.vob -V --avi_limit 5000 -nice $nice \
        -j $crop --export_asr $aspect -R 1 -w $bitrate \
        --divx_vbv_prof 3 --a52_drc_off -y divx5,null \
        -a $audiostream $customparm ; \
transcode -i work.vob -o work.avi -V --avi_limit 5000 -nice $nice \
        -j $crop --export_asr $aspect -R 2 -w $bitrate \
        --divx_vbv_prof 3 --a52_drc_off -y divx5 \
        -a $audiostream $audioparm $customparm