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.