Wxyz.de: Die Internetseite von Robin Holler

Springe: Zum Inhalt | Zum Hauptmenü

/ computer / Ubuntu / mp4Streaming

Nette Geste:

Mein Gästebuch freut sich auf Deinen Eintrag:

MP4-Pseudo-Streaming in HTML5-Browsern unter Windows OS

Juni 2015; getestet mit Ubuntu 14.04; ffmpeg 1.2.6-7

Unter Ubuntu verwendet man meist ffmpeg (bzw. avconv) zur schnellen und unkomplizierten Konvertierung von Videos. Um Videos in HTML5 einzubetten, überführt man das Originalvideo üblicherweise in Kopien der Formate MP4, WebM und gelegentlich OGM – unter Verwendung der für sie typischen Codecs.

Am Beispiel MP4 sähe das z. B. so aus:

ffmpeg -i original.mkv -c:v libx264 -pix_fmt yuv420p -profile:v high -preset slow -crf 20 -c:a libvo_aacenc -ab 96k ausgabe.mp4

Das funktioniert unter Ubuntu auch sehr gut, und das Video wird problemlos aus allen Browsern heraus gestreamt. Als ich probeweise aber einmal unter Windows meine Videos streamen wollte, wurde das Video stets erst komplett geladen, bevor es abgespielt wurde. Hier funktionierte das (Pseudo-)Streaming nicht.

Der Grund liegt im MP4-Format / in der MP4-Spezifikation: Der Index, bzw. die Informationen zu Teilstücken, Längen, Codecdetails, etc., auch movie atom oder moov atom gennannt, wird per Standard am Ende der Datei hinterlegt, was denkbar ungünstig für Streaming ist. Unter Ubuntu (GStreamer-spezifisch?) werden die Infos anscheinend vom Dateiende gezielt abgeholt, unter Windows fehlen sie jedoch, bis die Datei komplett im Zwischenspeicher liegt.

Es ist daher ratsam die Position des moov atom an den Dateianfang zu legen. Hierfür gab es ein eigenes Werkzeug (qt-faststart), das aber seit 2012 in ffmpeg integriert wurde. Deshalb kann man auf Kommandozeile einfach das entsprechende Fähnchen setzen:

-movflags +faststart

Das Plus muß in aktuellen Versionen nicht mehr gesetzt werden und hat keine Auswirkungen mehr, aber um auf Nummer sicher zu gehen ... Dieser Parameter läßt sich jedenfalls in obigem Beispiel ergänzen:

ffmpeg -i original.mkv -c:v libx264 -pix_fmt yuv420p -profile:v high -preset slow -crf 20 -c:a libvo_aacenc -ab 96k -movflags +faststart ausgabe.mp4

Möchte man verlustfrei seine bereits kodierten MP4-Videos streamingfähig machen, so erstellt folgende Zeile Kopien mit der richtigen Indexposition:

for vid in *.mp4; do ffmpeg -i $vid -codec copy -movflags faststart `basename $vid .mp4`_2.mp4; done

Youtube & Co handhaben dies analog beim Hochladevorgang, dort entfällt also die Notwendigkeit der Indexverschiebung.

Frohes Streamen!

Seitenanfang


Abspann:


Datenschutz
1999-2018, Robin Holler
1 Besucher von 774 860 Besuchern gegenwärtig

Bitcoin / Nextcoin this Flattr this