Videos in DVDs umwandeln

Tiefauflösende Videos

DVDs, das sind doch diese grässlichen Scheiben aus der Zeit, als man Filme noch auf physischen Datenträgern durch die Welt schleppte, die dauernd irgendwo verloren gingen und bei denen man immer Angst haben musste, dass man sie zerkratzt. Ganz zu schweigen von der Videoauflösung, ein Haufen Klötzchen weit weg von heutiger HD-Qualität. Und trotzdem, gelegentlich kann es sein, dass eine DVD genau das richtige Medium ist. Für diese seltenen Fälle wollen wir uns heute anschauen, wie man Videos auf eine DVD brennt, welche danach in handelsüblichen DVD-Geräten funktionieren soll.

Im Netz findet man haufenweise nützliche Informationen zum Thema, leider sind viele dieser Quellen aber veraltet, fehlerhaft oder unvollständig. Meistens werden in diesen Erklärungen zudem DVDs im NTSC-Format erstellt, Geräte in der alten Welt haben damit aber oft Mühe und bevorzugen PAL. Trotzdem sei auf Ruh's Linux Powered DVD Production Guide sowie den Artikel Convert any Movie to DVD Video aus dem ArchWiki hingewiesen: Beide Artikel sind sehr gut und ausführlich und ich habe mich bei beiden ausgiebig bedient.

Nun ist es also an der Zeit für eine kleine Übersicht, wie man im Jahr 2021 aus beliebigem Videomaterial eine DVD erstellen kann.

Software

Wir brauchen für diese Arbeit das eine oder andere Programm. Alles, was hier zum Einsatz kommt, ist freie Software und sollte in gängigen Linux-Distributionen enthalten sein. Konkret brauchen wir:

... und natürlich ein GNU/Linux-System. Ich habe zu diesem Zweck Parabola GNU/Linux verwendet.

Einzelschritte

Grob gesagt müssen wir folgende Dinge mit jeder Videodatei erledigen:

Aus allen so umgewandelten Dateien können wir dann ein ISO-Image bauen, welches wir auf die DVD brennen. In den folgenden Beispielen verwende ich jeweils datei.mkv als Beispiel für die originale Videodatei.

Tonspur umwandeln

Für die DVD brauchen wir eine Tonspur im AC-3-Format. An sich könnte man erwarten, dass beim Umwandeln des Videos die Tonspur auch gleich mitumgewandelt wird. Leider will das mit der aktuellen Version von ffmpeg nicht so richtig klappen, einzeln ist es aber keine grosse Sache:

$ ffmpeg -i datei.mkv -map 0 -vn -sn -acodec ac3 datei.ac3

Damit erhalten wir eine neue Datei namens datei.ac3 im gewünschten Format. Check.

Video umwandeln

Dieser Schritt ist etwas haariger. Um die Dateien am Ende kombinieren zu können, brauchen wir ein Video im MPEG-ES-Format. Leider habe ich es nicht geschafft, mit ffmpeg direkt eine solche Datei zu erzeugen, darum machen wir das in zwei Schritten.

Zuerst konvertieren wir das bestehende Video in ein Format, welches sich für die DVD eignet. Glücklicherweise hat ffmpeg dafür bereits Vorlagen eingebaut, wir müssen aber noch angeben, dass er ein Video mit 25 Bildern pro Sekunde erstellen soll, sonst hat das DVD-Gerät unter Umständen Mühe damit; das angegebene Seitenverhältnis von 4:3 ist ggf. den Videodaten anzupassen oder kann auch ganz weggelassen werden:

$ ffmpeg -i datei.mkv -an -f mpeg1video -vcodec mpeg2video -target pal-dvd -r 25 -aspect 4:3 datei.mpg

Das dauert eine Weile, danach haben wir aber ein MPEG-Video (-f mpeg1video) mit MPEG2-Codec (-vcodec mpeg2video) ohne Ton (-an) für PAL-DVDs (-target pal-dvd) mit 25 Bildern pro Sekunde (-r 25) und einem Seitenverhältnis von 4:3 (-aspect 4:3). Daraus können wir den benötigten elementary stream extrahieren:

$ tcextract -i datei.mpg -x mpeg2 > datei.m2v

Das war dann auch schon alles. War doch weniger schlimm als erwartet.

Dateien kombinieren

Nun haben wir eine Audio- und eine Videospur und möchten diese zu einer vollwertigen Datei mit Bild und Ton multiplexen, also kombinieren. Das machen wir so:

$ mplex -f 8 -M -o datei.dvd datei.m2v datei.ac3

Der Parameter -f 8 gibt dabei an, dass eine Datei im DVD-Format erzeugt werden soll.

Somit ist die Videodatei bereit. Falls weitere Videos auf die DVD sollen, ist jetzt der Zeitpunkt, um diese Befehle mit allen weiteren Dateien ebenfalls durchzugehen.

DVD-Image erstellen

Wenn unsere Videos bereit sind, können wir ein Image für die DVD erstellen. Wir verzichten dabei auf ein Menü und kombinieren die einzelnen Videos als «Kapitel», so kann man bequem von Video zu Video springen.

Zuerst brauchen wir dazu eine XML-Datei mit der Definition, was auf der DVD alles drauf sein soll. Die sieht folgendermassen aus:

<dvdauthor>
  <titleset>
    <titles>
      <pgc>
        <vob file="datei.dvd" />
      </pgc>
    </titles>
  </titleset>
</dvdauthor>

Der <vob ...>-Eintrag wird dabei für jede Videodatei wiederholt, die Datei könnte also auch so aussehen:

<dvdauthor>
  <titleset>
    <titles>
      <pgc>
        <vob file="datei1.dvd" />
        <vob file="datei2.dvd" />
        <vob file="datei3.dvd" />
        <vob file="datei4.dvd" />
        <vob file="datei5.dvd" />
      </pgc>
    </titles>
  </titleset>
</dvdauthor>

Dies speichern wir als dvd.xml. Danach erstellt der folgende Befehl daraus eine Verzeichnisstruktur für die DVD:

$ VIDEO_FORMAT=PAL dvdauthor -o dvd -x dvd.xml

Dabei wird ein neues Unterverzeichnis namens dvd erstellt. Falls das Verzeichnis bereits existiert, wird der neue Inhalt dort zusätzlich hinein kopiert; es ist also empfehlenswert, dies gegebenenfalls zuerst zu löschen.

Zusätzlich braucht es noch ein Inhaltsverzeichnis, damit der DVD-Spieler weiss, was er abzuspielen hat. Der folgende Befehl erzeugt dies auch wieder im dvd-Verzeichnis:

$ VIDEO_FORMAT=PAL dvdauthor -o dvd -T

Nun ist das Verzeichnis bereit und wir können daraus ein ISO-Image bauen:

$ mkisofs -dvd-video -udf -o dvd.iso dvd/

Und fast fertig. Unser Videomaterial sitzt jetzt kuschelig eingemottet in einem Image, welches nur noch darauf wartet, auf eine DVD gebrannt zu werden.

Testlauf

Jetzt ist es also so weit, wir könnten die DVD brennen. Ich brenne aber ungern Dinge, ohne sie vorher auszuprobieren; man weiss ja nie so genau, ob das wirklich klappt und irgendwie ist es schade, Berge von nutzlosen DVD-Prototypen zu produzieren. Darum wäre jetzt ein guter Moment für einen Testlauf.

Das erste, was man sicher mal ausprobieren kann, ist VLC:

$ vlc dvd.iso

VLC sollte das Image öffnen und gleich mit der Wiedergabe des ersten Films anfangen. Zudem sollten im «Playback»-Menü unter «Chapter» alle Videos auftauchen und auswählbar sein, die wir auf der DVD drauf haben wollen. Jetzt sollte auch ersichtlich werden, falls die Tonspur nicht synchron zur Videospur läuft. Im «Tools»-Menü kann man unter «Codec Information» zudem prüfen, ob die ganze Umwandlerei wirklich die gewünschten Formate erzeugt hat.

Bei mir sieht das beispielsweise so aus:

Leider reicht VLC alleine aber noch nicht, um wirklich sicher zu sein, dass die DVD dann auch in einem «normalen» Abspielgerät funktioniert; letztlich muss man das im Gerät selber testen. Ideal dazu wäre eine wiederbeschreibbare DVD-RW; damit kann man so lange an den Parametern schrauben, bis das Resultat funktioniert.

Blöderweise habe ich aber weder eine DVD-RW, noch einen DVD-Brenner, der mit solchen Medien zurecht kommt. Viele DVD-Player unterstützen aber auch cDVDs, auch bekannt als «Mini DVDs», also normale CDs mit DVD-Daten drauf. Eine alte CD-RW ist schnell gefunden und hat Platz für etwa eine halbe Stunde an DVD-Videomaterial – das sollte reichen für einen kleinen Test. Mein Philips DVP3980 spielte diese jedenfalls problemlos ab.

Brennen

Der Brennvorgang schliesslich ist äusserst unabenteuerlich, egal ob DVD oder CD-RW:

$ cdrecord -v dvd.iso

Ein paar Minuten warten, dann entspannen und DVD schauen als hätten gerade die späten Neunzigerjahre angefangen.

Automatisch

All diese Befehle abzutippen oder schon nur abzukopieren ist auf Dauer zu viel Arbeit für einen modernen Menschen, ich habe darum ein Makefile geschrieben, welches alle .mkv-Dateien in einem Ordner zu einem DVD-Image kombiniert. Leider ist make etwas empfindlich was Dateinamen angeht und es empfiehlt sich, diese zuerst noch zu bereinigen:

$ for file in *.mkv ; do  mv -i "${file}" "$(echo ${file} | sed -e 's/[^A-Za-z0-9._-]/_/g')" ; done

Am einfachsten ist es, das Makefile in den Ordner mit den Videos herunterzuladen und den Computer danach die ganze Drecksarbeit machen zu lassen:

$ wget -q https://www.ott.net/mach/dvds/Makefile
$ make

Das dauert dann wieder eine ganze Weile und während die Maschine denkt und rattert, können wir die Zeit produktiv nutzen um ein paar Snacks für den Videoabend zuzubereiten.