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
name=beispiel_film
1. Kopie des Films als vob-Datei erstellen
Allgemeiner Syntax:
mplayer dvd://<track> [-dvd-device <ger>] -v -dumpstream -dumpfile $name.vob </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
mplayer dvd://1 -v -dumpstream -dumpfile $name.vob
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:
[...] DVD successfully opened. audio stream: 0 format: ac3 (stereo) language: en aid: 128. audio stream: 1 format: ac3 (stereo) language: cz aid: 129. audio stream: 2 format: ac3 (stereo) language: de aid: 130. number of audio channels on disk: 3. [...] subtitle ( sid ): 3 language: en subtitle ( sid ): 4 language: cz subtitle ( sid ): 5 language: de [...] number of subtitles on disk: 10 [...]
Für weitere oder erweiterte Ausgabe kann der folgemde Befehl verwendet werden:
mplayer dvd://1 -identify -nosound -vo null -ss 03:00:00
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:
[...] ID_AUDIO_ID=128 ID_AID_128_LANG=en audio stream: 1 format: ac3 (stereo) language: cs aid: 129. ID_AUDIO_ID=129 ID_AID_129_LANG=cs audio stream: 2 format: ac3 (stereo) language: de aid: 130. ID_AUDIO_ID=130 ID_AID_130_LANG=de audio stream: 3 format: ac3 (stereo) language: hu aid: 131. [...] subtitle ( sid ): 3 language: en [...] subtitle ( sid ): 5 language: de [...]
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
dvdxchap -t <track><ger> > $name.chap </ger></track>
ausgelesen, also z.B.
dvdxchap -t 1 /dev/cd0 > $name.chap
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.
mplayer $name.vob -dumpvideo -dumpfile $name.m2v
5. Tonspuren extrahieren
Mencoder
Allgemein erhält man eine originale ac3-Tonspur mit dem Syntax
mplayer $name.vob -aid <aid> -dumpaudio -dumpfile $name.ac3 </aid>
also z.B. für die englische und deutsche Tonspur müssen folgende beiden Zeilen ausgeführt werden:
mplayer $name.vob -aid 128 -dumpaudio -dumpfile $name.en.ac3 mplayer $name.vob -aid 130 -dumpaudio -dumpfile $name.de.ac3
Transcode
Als Alternative kann ein Dump mit tcextract erzeugt werden. Allgemein gilt folgender Syntax:
tcextract -i <input /> -t vob -x ac3 -a <tonspur> > <output></output></tonspur>
Für das Beispiel also konkret:
tcextract -i $name.vob -t vob -x ac3 -a 1 > $name.en.ac3 tcextract -i $name.vob -t vob -x ac3 -a 3 > $name.de.ac3
Die Tonspur sollte nicht mit der ID verwechselt werden!
OGG Vorbis
Eine Tonspur kann als wav-Datei mit
mplayer $name.vob -ao pcm:file=$name.wav -vc dummy -aid <aid> -vo null </aid>
Gespeichert werden, also z.B.
mplayer $name.vob -ao pcm:file=$name.de.wav -vc dummy -aid 130 -vo null mplayer $name.vob -ao pcm:file=$name.en.wav -vc dummy -aid 128 -vo null
Da die Datei recht groß ist, empfiehlt sich eine Konvertierung zum freien OGG-Vorbis-Format:
oggenc -q5 $name.wav
Also für das Beispiel
oggenc -q5 $name.en.wav oggenc -q5 $name.de.wav
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
mencoder -sid <sid> -vobsubout $name -vobsuboutindex 0 -nosound -ovc copy -o /dev/null $name.vob </sid>
als z.B. für die englischen und deutschen Untertitel
mencoder -sid 3 -vobsubout $name.en -vobsuboutindex 0 -nosound -ovc copy -o /dev/null $name.vob mencoder -sid 5 -vobsubout $name.de -vobsuboutindex 0 -nosound -ovc copy -o /dev/null $name.vob
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:
mplayer $name.vob -vf cropdetect
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
mencoder -v\ $name.m2v\ -vf crop=720:432:0:72,harddup\ -ovc x264 -x264encopts threads=auto:crf=20:subq=7:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:weight_b\ -oac copy\ -o $name.264
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:
mkvmerge -o $name.mkv\ -d 0 -A -S -T $name.264\ --language "0:German" --default-track "0:yes" -a 0 -D -S -T $name.de.ac3\ --language "0:German" --default-track "0:no" -s 0 -D -A -T $name.de.idx\ --language "0:English" --default-track "0:no" -a 0 -D -S -T $name.en.ac3\ --language "0:English" --default-track "0:no" -s 0 -D -A -T $name.en.idx\ --chapters $name.chap
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:
mkvmerge -o $name.mkv --title "Titel des Videos"\ -d 0 -A -S -T $name.264\ --language "0:German" --default-track "0:yes" -a 0 -D -S -T $name.de.ac3\ --language "0:German" --default-track "0:no" -s 0 -D -A -T $name.de.idx\ --language "0:English" --default-track "0:no" -a 0 -D -S -T $name.en.ac3\ --language "0:English" --default-track "0:no" -s 0 -D -A -T $name.en.idx\ --chapters $name.chap