Mediendateien für Media Source Extensions transkodieren
Wenn Sie mit Media Source Extensions arbeiten, müssen Sie Ihre Mediendateien wahrscheinlich aufbereiten, bevor Sie sie streamen können. Dieser Artikel erläutert die Anforderungen und zeigt eine Toolchain, mit der Sie Ihre Dateien passend kodieren können.
Erste Schritte
- Der erste und wichtigste Schritt besteht darin, sicherzustellen, dass Ihre Dateien einen Container und einen Codec verwenden, die von den Browsern Ihrer Nutzer unterstützt werden.
- Je nach Codec müssen Sie die Datei möglicherweise fragmentieren, damit sie der ISO-BMFF-Spezifikation entspricht.
- (Optional) Wenn Sie Dynamic Adaptive Streaming over HTTP (DASH) für Streaming mit adaptiver Bitrate verwenden möchten, müssen Sie Ihre Mediendateien in mehreren Auflösungen transkodieren. Die meisten DASH-Clients erwarten eine zugehörige Media-Presentation-Description-Manifestdatei (MPD), die üblicherweise beim Erstellen der Dateien in den verschiedenen Auflösungen generiert wird.
Im Folgenden behandeln wir alle diese Schritte. Zunächst sehen wir uns jedoch eine Toolchain an, mit der sie sich recht einfach durchführen lassen.
Beispielmedium
Wenn Sie die hier aufgeführten Schritte nachvollziehen möchten, aber kein Medium zum Experimentieren haben, können Sie den Trailer von Big Buck Bunny herunterladen. Das Urheberrecht an Big Buck Bunny liegt bei der Blender Foundation; das Werk ist unter der Lizenz Creative Commons Attribution 3.0 lizenziert. In diesem Tutorial wird durchgehend der Dateiname trailer_1080p.mov für diese heruntergeladene Datei verwendet.
Benötigte Werkzeuge
Für die Arbeit mit MSE benötigen Sie folgende Werkzeuge:
- ffmpeg — Ein Befehlszeilenprogramm, mit dem Sie Ihre Mediendateien in die erforderlichen Formate transkodieren können. Auf der Seite FFmpeg herunterladen können Sie eine Version für Ihr System herunterladen. Extrahieren Sie die ausführbare Datei aus dem Archiv und fügen Sie ihren Speicherort zu Ihrer PATH-Umgebungsvariablen hinzu. Nutzer von macOS können ffmpeg auch mit Homebrew installieren.
- Bento4 — Eine Sammlung von Befehlszeilenprogrammen zum Auslesen von Metadaten aus Mediendateien und zum Erstellen von Inhalten für DASH. Für die Installation müssen Sie die Anwendung je nach Betriebssystem und Ihren Präferenzen selbst aus den bereitgestellten Projekt- oder Quelldateien erstellen und kompilieren. Weitere Informationen finden Sie in der Build-Anleitung. Alternativ können Sie eine vorkompilierte Version herunterladen. Legen Sie den Inhalt des Verzeichnisses
binam selben Ort wie ffmpeg ab. - python2 — Wird von Bento4 verwendet.
Installieren Sie diese Werkzeuge, bevor Sie mit dem nächsten Schritt fortfahren.
Legen Sie das Beispielmedium im Verzeichnis utils von Bento4 ab und führen Sie die folgenden Schritte dort aus.
Hinweis:
Die vorkompilierte Version von ffmpeg enthält libfdk_aac aus Lizenzgründen nicht. Bento4 verwendet diese Bibliothek standardmäßig. Kompilieren Sie ffmpeg daher bei Bedarf selbst. Wenn Sie libfdk_aac nicht benötigen, fügen Sie beim Aufruf von mp4-dash-encode.py die Option --audio-codec=aac hinzu.
Unterstützung für Container und Codecs
Wie in Abschnitt 1.1 der MSE-Spezifikation: Ziele festgelegt, ist MSE so konzipiert, dass keine Unterstützung für ein bestimmtes Medienformat oder einen bestimmten Codec erforderlich ist. In der Praxis variiert jedoch die Browser-Unterstützung für bestimmte Kombinationen aus Container und Codec.
Um zu prüfen, ob der Browser einen bestimmten Container unterstützt, können Sie der Methode MediaSource.isTypeSupported() einen String mit dem MIME-Typ übergeben:
MediaSource.isTypeSupported("audio/mp3"); // false
MediaSource.isTypeSupported("video/mp4"); // true
MediaSource.isTypeSupported('video/mp4; codecs="avc1.4D4028, mp4a.40.2"'); // true
Der String enthält den MIME-Typ des Containers, optional gefolgt von einer Liste der Codecs. Während sich der MIME-Typ recht einfach ermitteln lässt, können wir den Codec-String mit dem Dienstprogramm mp4info bestimmen.
MP4-Container mit H.264-Video und AAC-Audio werden derzeit von allen modernen Browsern unterstützt; bei anderen Kombinationen ist das nicht der Fall.
Um unser Beispielmedium von einem QuickTime-MOV-Container in einen MP4-Container umzuwandeln, können wir ffmpeg verwenden. Da der Audio-Codec im MOV-Container bereits AAC und der Video-Codec bereits H.264 ist, können wir ffmpeg anweisen, die Daten nicht zu transkodieren. Stattdessen kopiert es lediglich die Audio- und Videospuren. Das geht vergleichsweise schneller als eine Transkodierung.
ffmpeg -i trailer_1080p.mov -c:v copy -c:a copy bunny.mp4
Fragmentierung prüfen
Damit ein MP4-Stream ordnungsgemäß funktioniert, muss die Mediendatei eine MP4-Datei im ISO-BMFF-Format sein. Ohne korrekte Fragmentierung ist nicht gewährleistet, dass eine MP4-Datei mit MSE funktioniert. Bei der Fragmentierung werden die Metadaten über den Container verteilt, statt an einer Stelle gebündelt zu sein.
Um zu prüfen, ob eine MP4-Datei als Stream geeignet ist, können Sie erneut das Dienstprogramm mp4info verwenden und sich die Atome der MP4-Datei auflisten lassen.
Hinweis: Die fragmentierte Version ist etwas größer als das Original, weil zusätzliche Metadaten über die Datei verteilt sind. Die Dateigröße nimmt dadurch normalerweise um höchstens ein Prozent zu.
Fragmentieren
Wenn Ihre Mediendatei noch keine MP4-Datei ist, kann ffmpeg beim Transkodieren mit dem Befehlszeilenparameter -movflags frag_keyframe+empty_moov eine korrekt fragmentierte MP4-Datei erzeugen:
ffmpeg -i trailer_1080p.mov -c:v copy -c:a copy -movflags frag_keyframe+empty_moov bunny_fragmented.mp4
Wenn Sie bereits eine MP4-Datei haben, diese aber nicht korrekt fragmentiert ist, können Sie ebenfalls ffmpeg verwenden:
ffmpeg -i non_fragmented.mp4 -movflags frag_keyframe+empty_moov fragmented.mp4
In beiden Fällen kann es für Chrome erforderlich sein, ein zusätzliches Movie-Flag zu setzen:
-movflags frag_keyframe+empty_moov+default_base_moof
Für den Einstieg benötigen Sie lediglich eine korrekt fragmentierte MP4-Datei. Wenn Sie Streaming mit adaptiver Bitrate einsetzen möchten, müssen Sie Versionen in mehreren Auflösungen kodieren. MSE ist zwar flexibel genug für eine eigene Implementierung, es empfiehlt sich jedoch nachdrücklich, einen vorhandenen DASH-Client zu verwenden, da DASH ein klar spezifiziertes Anwendungsprotokoll ist.
Inhalte für DASH erstellen
Wenn ffmpeg und die Dienstprogramme von Bento4 über Ihre $PATH-Umgebungsvariable erreichbar sind, können Sie das Python-Skript mp4-dash-encode.py von Bento4 ausführen, um mehrere Versionen Ihrer Inhalte in verschiedenen Auflösungen zu kodieren. Anschließend können Sie mit dem Python-Skript mp4-dash.py von Bento4 die zugehörige MPD-Datei generieren, die Clients benötigen.
Führen Sie die folgenden Befehle aus:
python mp4-dash-encode.py -b 5 -v bunny_fragmented.mp4
python mp4-dash.py video_0*
Dabei sollten folgende Dateien erzeugt werden:
output
├── audio
│ └── und
├── stream.mpd
└── video
├── 1
├── 2
├── 3
├── 4
└── 5
Hinweis:
mp4-dash-encode.py zeigt Fehlermeldungen von ffmpeg nicht an. Mit der Option -d können Sie diese sichtbar machen.
Hinweis:
Wenn "Invalid duration specification for force_key_frames: 'expr:eq(mod(n" als Fehlermeldung angezeigt wird, bearbeiten Sie mp4-dash-encode.py und entfernen Sie die beiden "'" aus "-force_key_frames 'expr:eq(mod(n,%d),0)'".
Zusammenfassung
Nachdem Ihr Video korrekt kodiert ist und die Mediendateien für adaptive Bitraten erstellt wurden, können Sie mit DASH und MSE auf Ihrer Website Streaming mit adaptiver Bitrate anbieten.