Ich wandele VDR-TV-Aufnahmen in MP4 Dateien um, die auf dem iPhone und mit Quicktime wiedergegeben werden können. Im folgenden erkläre ich euch, wie ich das mache. Die Anleitung funktioniert allerdings nur für SD-Programme. HD-Videos müssen anders behandelt werden*.

Die Ausgangssituation: Die VDR Aufnahme

LinVDR speichert TV-Aufnahmen als MPEG-TS (Transport Stream) auf die Festplatte. Die Datei enthält eine MPEG2 Video-Spur und, je nach Sender/Sendung, mehrere Audio-Spuren und sonstige Inhalte. In den meisten fällen, die ich beobachtet habe, ist die erste Tonspur 192 Kbit/s MP2 komprimiert und eine zweite Tonspur 384 Kbit/s AC3 komprimiert. Beide sind bei 48KHz, Stereo encodiert.

Mein VDR ist so konfiguriert, dass die Aufnahme in 2GB große Stücke aufgespalten wird. Mehrstündige Sendungen erstrecken sich also über mehrere Dateien. Neben dem Video werden noch Info-Dateien mit den Werbe-Schnittmarken und EPG-Text abgelegt.

Das Ziel: Die MP4 Datei

Der MP4 Format-Container enthält in der Regel einen H.264 Videostrom und mindestens einen AAC Audiostrom. Damit sind unsere Zielformate schon klar vorgegeben. Sowohl der Quicktime-Player als auch das iPhone/iPad können eine Videodatei in diesem Format abspielen. Als Ton-Quelle soll natürlich die qualitativ hochwertigere AC3 Spur herhalten, sofern eine in der Quelle vorhanden ist. Die Video-Spur soll deinterlaced werden.

Das Werkzeug

Hier eine kurze Liste der Software die ich benutze. Ich verwende als Plattform ein Linux-Betriebsystem, grundsätzlich sind die Programme aber auch unter Windows oder Mac OSX lauffähig. Alle Tools sind frei (zumindest wie in kostenlos), wenn auch nicht ausschließlich unter GPL, erhältlich.

Wie die Tools im einzelnen benutzt werden, erkläre ich im folgenden Abschnitt. Ich benutze meistens die aktuellste Stable-Version der entsprechenden Software mit Ausnahme von ffmpeg und libx264. Beide sind frisch aus dem entsprechneden Source-Repository kompiliert.

De-muxen mit Project-X

Wir haben also eine etwas undefinierte Ausgangslage. Unsere Ausgangsdatei liegt evtl. in mehreren Scheibchen vor und enthällt mindestens eine unbekannte Anzahl an Tonspuren. Mit Hilfe von Project-X können wir die Dateischeiben zu einer großen Datei zusammenfügen und behalten/rekonstruieren dabei alle Time-Code Informationen der einzelnen Spuren.

java -jar ProjectX.jar -demux -name out.X $ifiles

$ifiles ist eine Liste der Ausgangsdateien. (z.B “001.vdr 002.vdr 003.vdr”) Nach dem Schritt haben wir mehrere Dateien mit dem Namen out.

  • out.m2v – unsere Videospur
  • out.mp2 – die Standardtonspur in guter Qualität
  • out.ac3 – die Tonspur mit hoher Qualität

Die out.ac3 ist, wie schon erwähnt, nicht immer enthalten.

re-Muxen mit FFMPEG

Im nächsten Schritt machen wir aus den einzelnen Dateien einen progressiven Datenstrom mit der Videospur und einer Tonspur unserer wahl.

if [ -s out.ac3 ] ; then
     ffmpeg -y -fflags +genpts -i out.m2v -i out.ac3 -vcodec copy -acodec copy -f vob out.mpeg
elif [ -s out.mp2 ] ; then
    ffmpeg -y -fflags +genpts -i out.m2v -i out.mp2 -vcodec copy -acodec copy -f vob out.mpeg
fi

Das Flag +genpts hilft dabei, aus dem Transportstrom einen progressiven Datenstrom zu erstellen. Die Resultierende Datei out.mpeg hat jetzt eine recht definierten Zustand und eignet sich damit bestens zur Weiterverarbeitung.

MPEG in MP4 konvertieren

Jetzt können wir die erste Version der MP4 Datei erstellen, die wir später noch mit Meta-Informationen anreichern.

ffmpeg out.mpeg -filter:v yadif -vcodec libx264 -preset faster -profile:v main -level 3.1 -8x8dct 0 -crf 24 -acodec libaacplus -b:a 56000 -f mp4 -y out.mp4

Mit dem Yadif-Filter wird die Aufnahme aus dem Halbbildformat (interlaced) in ein Vollbildformat (de-interlaced) umgerechnet. Als Rate-Control-Methode benutze ich hier CRF (constant rate factor) für durchgehend gleichbleibende Qualität. Mit den Parameter kann man rumspielen sollte aber beachten, dass es für die Wiedergabe auf verschiedenen iOS Geräten verschiedene Begrenzungen gibt.

Die resultierende Datei out.mp4 ist jetzt bereits fertig zum Abspielen.

 Cover mit MP4Box

Als nächstes erstellen wir ein Vorschaubild mit FFMPEG und schreiben es in die Datei.

ffmpeg -i out.mpeg -filter:v yadif,scale=iw*sar:ih,scale=320:-1 -ss 00:05:00.00 -t 1 -y -f image2 -vcodec mjpeg -vframes 1 out.jpg

  • Als Ausgangsmaterial dient hier unsere Zwischendatei out.mpeg.
  • Diese wird mit dem yadif Filter vom Halbzeilenformat auf das Vollbildformat umgerechnet.
  • Mit scale=iw*sar:ih erhält das Bild quadratische Pixel unter Berücksichtigung vom Seitenverhältnis.
  • Der Filter scale=320:-1 sorgt dafür, dass das Vorschaubild 320 Pixel breit ist und die Bildhöhe unter Beachtung des Seitenverhältnisses automatisch ausgerechnet wird
  • Das Foto zeigt die 5. Abspielminute mit -ss 00:05:00.00.

Jetzt fügen wir die Datei out.jpg in unser out.mp4 ein mit:

MP4Box -mpeg4 -ipod -fps 25 -itags cover=out.jpg out.mp4

Mit MP4Box können noch mehr Meta-Informationen hinzugefügt werden wie Künstler, Sendungstitel, Beschreibung usw.

Werbeschnittmarkierungen als Kapitelmarken

Mit noad erstell der VDR Recorder Schnittmarken für den Anfang und das Ende eines Werbeblocks. Mit MP4Box und mp4chaps können diese als Quicktime Kapitelmarken in die MP4 Datei eingefügt werden. Zuvor muss die Textdatei aber noch in das richtige Format gebracht werden. Das mache ich mit einem selbstgeschriebenen Script vdr2chap.

Die Datei mit den Schnittmarken heisst z.B. marks.vdr. Diese dient als Eingabe. Die konvertierte Ausgabe speichern wir als chapters.txt.

cat marks.vdr | perl vdr2chap.pl > chapters.txt

Jetzt fügen wir die Kapitelmarken in das Video ein:

MP4Box -chap chapters.txt out.mp4

Zum Schluss wandeln wir diese in Quicktime kompatible Kapitelmarken um:

mp4chaps --convert --chapter-qt out.mp4

Ich schneide den Teil aus dem Video mit Absicht nicht raus, da noad für meinen Geschmack (noch) nicht zuverlässig genug funktioniert.

Abspiel-Schnellstart

Mit qtfaststart, dass als binary aus den ffmpeg sources kompiliert werden kann, werden die Video-“Atome” neu sortiert, damit die Dateibeschreibung vom Player am Dateianfang gefunden werden kann. Das sorgt dafür, dass die Datei bereits angesehen werden kann, während sie im Hintergrund noch kopiert wird. (Pseudo-Streaming oder auch als HTTP/FTP-Streaming bekannt)

qtfaststart out.mp4 faststart.mp4

Und zum Schluss geben wir der faststart.mp4 Datei noch einen Aussagekräftigen Namen und wir sind fertig.

Bash Script

Natürlich ist es deutlich einfacher, dass ganze parametrisiert in einem bash-script abhandeln zu lassen. Ich lasse per Cron-Job nach fertigen Aufnahmen suchen und konvertiere diese anschließend automatisch. Als kleines Goodie bekomme ich den Text aus den EPG-Infos und das Vorschaubild noch per eMail zugesandt. Natürlich werden bei erfolgreicher Abarbeitung alle Zwischendateien gelöscht. Da ich für die ursprüngliche Aufnahme keine weitere Verwendung habe, lösche ich diese Ebenfalls.

Kritik, Fragen und Hinweise können gerne in den Kommentaren Hinterlassen werden.

Allesblog#EPG#ffmpeg#MP4#Quicktime#VDR
    • Skeeve
    • Schade 🙁 Jetzt habe ich zwar mp4chaps, aber leider macht es keinen Unterschied. VLC sieht meine Chapter, Quicktime nicht.

WebM Logo
Weil doch noch mal die Nachfrage kam, wie man ffmpeg mit webm-support zusammenbaut, hier die Parameter um das interne Vorbis zu umgehen und die externe libvpx einzubinden. Natürlich müssen libvpx und libvorbis bereits vorhanden sein.

~/src/ffmpeg$ ./configure –disable-encoder=vorbis –enable-libvorbis –enable-libvpx

~/src/ffmpeg$ make
~/src/ffmpeg$ make install

In der aktuellen Podcast Episode Bits und so Nummer 234 geht es unter der Überschrift “State of the Web” auch über die H.264 und WebM Diskussion, gemeinsam mit Gerrit van Aaken.

Und weil es so schön war, anbei noch den Kurzfilm Sintel, gerendert in WebM mit ähnlichen Parametern, wie ich es auch schon bei Big Buck Bunny gezeigt habe.

Video: libvpx [v0.9.5], 640×273, 500Kb/s, 2-pass-encoding
Audio: libvorbis, 48kHz, stereo, 64 kb/s
File: 71,2 MB (74.732.658 Byte), 21312 Bilder, 14:48 Minuten
License: © copyright Blender Foundation | www.sintel.org

Jetzt aber genug technisches gefasel, Film ab!

Und natürlich ebenfalls wie beim letzen mal noch 3 weitere Standbilder aus dem Film: (more…)

Allesblog#ffmpeg#libvpx#Sintel#WebM

WebM LogoMit ffmpeg lassen sich im handumdrehen Videos transcodieren, dessen verwendete Codecs lizenzfrei genutzt werden dürfen. Dazu bedient man sich aktuell am besten dem WebM Format. Dieses Videoformat ist dem matroska (.mkv) Kontainerformat sehr ähnlich und verwendet VP8 für den Video- und Vorbis für den Audio-Datenstrom.
Von der Qualität her soll VP8 zwischen h.264 und Ogg Theora liegen. Da die Encoder-Software aber noch lange nicht den Reifegrad aktueller h.264-Encoder haben, darf man hier noch einige Sprünge sowohl bei der Qualität als auch der Geschwindigkeit erwarten. Ich denke zwischen h.264 und WebM wird es mittelfristig kaum noch signifikante Unterschiede geben.

Im aktuellen ffmpeg Quellcode gibt es allerdings einen Bug mit dem internen Vorbis Encoder. Es hat mich eine kleine google Weile gebraucht, bis ich einen Workaround dafür gefunden hatte. Der Trick ist, nicht den internen Vorbis-codierer zu benutzen, sonden die externe Libvorbis Bibliothek. Dazu kann man entweder beim einzelnen Encoding-Vorgang libvorbis enforcen oder die interne Library gar nicht erst in das Binary einkompilieren. Dann klappts auch mit WebM. 😉

Big Buck Bunny, alternative Versionen zum Download:

Video: libvpx [v0.9.1], 640×360, 1Mb/s, 2-pass-encoding
Audio: libvorbis, 48kHz, stereo, 64 kb/s
File: 75 MB (78560998 Byte), 14315 Bilder, 9:56 Minuten
License: CC-BY

Falls dein Browser WebM nicht unterstützt und dir kein Video oben anzeigt, habe ich mit VLC noch ein Paar Standbilder zum stillen Genießen angefertigt.

Allesblog#ffmpeg#google#vorbis#WebM