MEncoder: DVD konvertieren zu H.264 und AC3

Erstellen einer hochwertigen Kopie einer DVD mit mehreren Tonspuren und Untertiteln.

Die folgenden Schritte dürfen selbstverständlich nur auf DVDs ohne Kopierschutz für den privaten Gebrauch angewendet werden.

Ziel ist eine qualitativ hochwertige Kopie eines Films mit mehreren AC3 Tonspuren und den dazugehörigen Untertiteln ohne den sonstigen Ballast zu erhalten. Dies soll sich via Script auch leicht automatisieren lassen. Es gibt sehr viele individuelle Anleitungen. für weitere Informationen können die Links auf der rechten Seite herangezogen werden.

Folgende Programme kommen unter FreeBSD 9 zum Einsatz:

  • mplayer (Version 1.0.r20120322_1)
  • mencoder (Version 1.0.r20120322_1)
  • dvdxchap (gehört zum Paket ogmtools Version 1.5_9)
  • mkvmerge (gehört zum Paket mkvtoolnix Version 5.0.1)
  • tcextract (gehört zum Paket transcode Version 1.1.7)

Alle Befehle werden unter der BASH ausgeführt, dies ist aber nur für die Definition der Variablen $name von Bedeutung:


0. Definition des Namens

  1. 
  2. name=beispiel_film

1. Kopie des Films als vob-Datei erstellen

Allgemeiner Syntax:

  1. 
  2. mplayer dvd://<track> [-dvd-device <ger>] -v -dumpstream -dumpfile $name.vob &#13;
  3. </ger></track>

Bei den meisten DVDs befindet sich der Film auf Track 1. Falls nicht das Standard-DVD-Laufwerk genutzt werden soll, muss der Pfad des Geräts angegeben werden. Für die meisten Fälle sollte also die Zeile

  1. &#13;
  2. mplayer dvd://1 -v -dumpstream -dumpfile $name.vob&#13;

zum Erstellen der Kopie genügen. Diese Kopie erhält alle Tonspuren und alle Untertitel, sowie das Video in der Original-Kodierung mpeg2 und hat üblicherweise eine Dateigröße von mehreren Gigabyte.


2. IDs für Tonspuren und Untertitel ermitteln

Für die weitere Verarbeitung werden die Audio-IDs (aid) und Untertitel-IDs (sid) benötigt. In der Ausgabe unter Punkt 1 sollte folgender ähnlicher Inhalt enthalten sein:

  1. &#13;
  2. [...]&#13;
  3. DVD successfully opened.&#13;
  4. audio stream: 0 format: ac3 (stereo) language: en aid: 128.&#13;
  5. audio stream: 1 format: ac3 (stereo) language: cz aid: 129.&#13;
  6. audio stream: 2 format: ac3 (stereo) language: de aid: 130.&#13;
  7. number of audio channels on disk: 3.&#13;
  8. [...]&#13;
  9. subtitle ( sid ): 3 language: en&#13;
  10. subtitle ( sid ): 4 language: cz&#13;
  11. subtitle ( sid ): 5 language: de&#13;
  12. [...]&#13;
  13. number of subtitles on disk: 10&#13;
  14. [...]&#13;

Für weitere oder erweiterte Ausgabe kann der folgemde Befehl verwendet werden:

  1. &#13;
  2. mplayer dvd://1 -identify -nosound -vo null -ss 03:00:00&#13;

Prinzipiell lässt sich der Befehl grep anwenden, allerdings können weitere Informationen interessant sein, wenn z.B. mehrere Tonspuren für eine Sprache vorliegen. Auszug eines möglichen Outputs:

  1. &#13;
  2. [...]&#13;
  3. ID_AUDIO_ID=128&#13;
  4. ID_AID_128_LANG=en&#13;
  5. audio stream: 1 format: ac3 (stereo) language: cs aid: 129.&#13;
  6. &#13;
  7. ID_AUDIO_ID=129&#13;
  8. ID_AID_129_LANG=cs&#13;
  9. audio stream: 2 format: ac3 (stereo) language: de aid: 130.&#13;
  10. &#13;
  11. ID_AUDIO_ID=130&#13;
  12. ID_AID_130_LANG=de&#13;
  13. audio stream: 3 format: ac3 (stereo) language: hu aid: 131.&#13;
  14. [...]&#13;
  15. &#13;
  16. subtitle ( sid ): 3 language: en&#13;
  17. [...]&#13;
  18. &#13;
  19. subtitle ( sid ): 5 language: de&#13;
  20. [...]&#13;

Interessant sollen für Audio und Untertitle jeweils die deutsche und englische Sprach sein, das Bedeutet fürs englische: Audio ID (aid) 128 und Subtitle-ID (sid) 3 und fürs deutsche aid 130 und sid 5. Diese IDs sind nicht standardisiert und variieren deswegen.


3. Kapitelinformationen

Um die Kapitel beizubehalten werden diese Informationen allgemein mit

  1. &#13;
  2. dvdxchap -t <track><ger> &gt; $name.chap&#13;
  3. </ger></track>

ausgelesen, also z.B.

  1. &#13;
  2. dvdxchap -t 1 /dev/cd0 &gt; $name.chap&#13;

Die DVD kann nun entfernt werden, für die weiteren Schritte sind nur die Informationen in den Dateien relevant.


4. Video extrahieren

Dieser Schritt führt dazu, dass Audio und Video am Ende synchron sind.

  1. &#13;
  2. mplayer $name.vob -dumpvideo -dumpfile $name.m2v&#13;

5. Tonspuren extrahieren


Mencoder

Allgemein erhält man eine originale ac3-Tonspur mit dem Syntax

  1. &#13;
  2. mplayer $name.vob -aid <aid> -dumpaudio -dumpfile $name.ac3&#13;
  3. </aid>

also z.B. für die englische und deutsche Tonspur müssen folgende beiden Zeilen ausgeführt werden:

  1. &#13;
  2. mplayer $name.vob -aid 128 -dumpaudio -dumpfile $name.en.ac3&#13;
  3. mplayer $name.vob -aid 130 -dumpaudio -dumpfile $name.de.ac3&#13;

Transcode

Als Alternative kann ein Dump mit tcextract erzeugt werden. Allgemein gilt folgender Syntax:

  1. &#13;
  2. tcextract -i <input /> -t vob -x ac3 -a <tonspur> &gt; <output></output></tonspur>

Für das Beispiel also konkret:

  1. &#13;
  2. tcextract -i $name.vob -t vob -x ac3 -a 1 &gt; $name.en.ac3&#13;
  3. tcextract -i $name.vob -t vob -x ac3 -a 3 &gt; $name.de.ac3&#13;

Die Tonspur sollte nicht mit der ID verwechselt werden!


OGG Vorbis

Eine Tonspur kann als wav-Datei mit

  1. &#13;
  2. mplayer $name.vob -ao pcm:file=$name.wav -vc dummy -aid <aid> -vo null &#13;
  3. </aid>

Gespeichert werden, also z.B.

  1. &#13;
  2. mplayer $name.vob -ao pcm:file=$name.de.wav -vc dummy -aid 130 -vo null &#13;
  3. mplayer $name.vob -ao pcm:file=$name.en.wav -vc dummy -aid 128 -vo null &#13;

Da die Datei recht groß ist, empfiehlt sich eine Konvertierung zum freien OGG-Vorbis-Format:

  1. &#13;
  2. oggenc -q5 $name.wav &#13;

Also für das Beispiel

  1. &#13;
  2. oggenc -q5 $name.en.wav &#13;
  3. oggenc -q5 $name.de.wav &#13;

Diese Variante ist zwar verlustbehaftet, der Vorteil ist, dass die Tonspuren normalisiert (alle Filme hätten die gleiche Lautstärke) werden können und dass vielleicht so Kompatibilitätsprobleme beseitigt werden können.


6. Untertitel extrahieren

Allgemein mit

  1. &#13;
  2. mencoder -sid <sid> -vobsubout $name -vobsuboutindex 0 -nosound -ovc copy -o /dev/null $name.vob&#13;
  3. </sid>

als z.B. für die englischen und deutschen Untertitel

  1. &#13;
  2. mencoder -sid 3 -vobsubout $name.en -vobsuboutindex 0 -nosound -ovc copy -o /dev/null $name.vob&#13;
  3. mencoder -sid 5 -vobsubout $name.de -vobsuboutindex 0 -nosound -ovc copy -o /dev/null $name.vob&#13;

7. Video konvertieren

Hier gehören viele Parameter rein, die die Qualität und die Größe des konvertieren Films, sowie die Dauer der Konvertierung beeinflussen, das Optimum muss jeder für sich herausfinden. Für mich kamen folgende in Frage:


Ränder abschneiden

Mit mplayer können die Parameter zum Abschneiden der schwarzen Ränder ermittelt werden:

  1. &#13;
  2. mplayer $name.vob -vf cropdetect &#13;

Damit erhält man die Werte für dem crop-Filter (z.B. -vf crop=720:432:0:72).


Video mit Codec H.264 konvertieren

  1. &#13;
  2. mencoder -v\&#13;
  3. $name.m2v\&#13;
  4. -vf crop=720:432:0:72,harddup\&#13;
  5. -ovc x264 -x264encopts threads=auto:crf=20:subq=7:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:weight_b\&#13;
  6. -oac copy\&#13;
  7. -o $name.264&#13;

An dieser Stelle kann natürlich auch ein anderer Codec verwendet werden, je nach Kompatibilität (Player) und Qualitätansprüchen. Das Video kann man auch mit Hilfe des entsprechenden Filters verkleinern und dadurch die Dateigröße erheblich reduzieren.


8. Alles in einem Matroska-Container zusammenfügen

Das finale Kommando dazu lautet:

  1. &#13;
  2. mkvmerge -o $name.mkv\&#13;
  3. -d 0 -A -S -T $name.264\&#13;
  4. --language "0:German" --default-track "0:yes" -a 0 -D -S -T $name.de.ac3\&#13;
  5. --language "0:German" --default-track "0:no" -s 0 -D -A -T $name.de.idx\&#13;
  6. --language "0:English" --default-track "0:no" -a 0 -D -S -T $name.en.ac3\&#13;
  7. --language "0:English" --default-track "0:no" -s 0 -D -A -T $name.en.idx\&#13;
  8. --chapters $name.chap&#13;

Nach Bedarf müssen selbstverständlich die Dateinamen für andere Audio-Formate (ogg) angepasst werden.

Das Video sollte nun problemlos - bei vorhandenen Codex - auf den meisten Software-Playern abspielbar sein. Die originalen Tonspuren können natürlich auch noch in andere Formate (mp3, ogg) konvertiert werden, um eine größere Kompatibilität zu erreichen.


Titel einbinden

In manchen Playern wird der Namen des Videos angezeigt. Diese Anzeige kann mit der Option title beeinflusst werden:

  1. &#13;
  2. mkvmerge -o $name.mkv --title "Titel des Videos"\&#13;
  3. -d 0 -A -S -T $name.264\&#13;
  4. --language "0:German" --default-track "0:yes" -a 0 -D -S -T $name.de.ac3\&#13;
  5. --language "0:German" --default-track "0:no" -s 0 -D -A -T $name.de.idx\&#13;
  6. --language "0:English" --default-track "0:no" -a 0 -D -S -T $name.en.ac3\&#13;
  7. --language "0:English" --default-track "0:no" -s 0 -D -A -T $name.en.idx\&#13;
  8. --chapters $name.chap&#13;