Wenn Sie mit Media Source Extensions arbeiten, ist es wahrscheinlich, dass Sie Ihre Assets vorbereiten müssen, bevor Sie sie streamen können. Dieser Artikel führt Sie durch die Anforderungen und zeigt Ihnen eine Toolchain, mit der Sie Ihre Assets entsprechend kodieren können.
Erste SchritteIm Folgenden behandeln wir all diese Schritte, aber zunächst schauen wir uns eine Toolchain an, die uns dies relativ einfach ermöglicht.
BeispielmedienWenn Sie die hier aufgeführten Schritte befolgen möchten, aber keine Medien zum Experimentieren haben, können Sie sich den Trailer zu Big Buck Bunny herunterladen. Big Buck Bunny ist urheberrechtlich geschützt durch die Blender Foundation und ist unter der Creative Commons Attribution 3.0 Lizenz lizenziert. In diesem Tutorial wird der Dateiname trailer_1080p.mov verwendet, was dem Download entspricht.
Benötigte WerkzeugeBei der Arbeit mit MSE sind die folgenden Werkzeuge unverzichtbar:
bin
Verzeichnisses an derselben Stelle ab wie ffmpeg.Installieren Sie diese erfolgreich, bevor Sie zum nächsten Schritt übergehen.
Beispielmedien sollten im utils
Verzeichnis von Bento4 abgelegt und dort bearbeitet werden.
Hinweis: Das vorgefertigte ffmpeg enthält aus lizenzrechtlichen Gründen nicht libfdk_aac. Bento4 verwendet dies standardmäÃig, daher müssen Sie ffmpeg bei Bedarf kompilieren. Falls Sie es nicht benötigen, fügen Sie --audio-codec=aac
zur mp4-dash-encode.py
Befehlszeile hinzu.
Wie in Abschnitt 1.1 der MSE-Spezifikation: Ziele angegeben, ist MSE so konzipiert, dass keine Unterstützung für ein bestimmtes Medienformat oder einen bestimmten Codec erforderlich ist. Während dies theoretisch zutrifft, variiert die Browserunterstützung für bestimmte Container-/Codec-Kombinationen.
Um zu überprüfen, ob der Browser einen bestimmten Container unterstützt, können Sie einen MIME-Typ-String an die Methode MediaSource.isTypeSupported()
übergeben:
MediaSource.isTypeSupported("audio/mp3"); // false
MediaSource.isTypeSupported("video/mp4"); // true
MediaSource.isTypeSupported('video/mp4; codecs="avc1.4D4028, mp4a.40.2"'); // true
Der String ist der MIME-Typ des Containers, der optional von einer Liste von Codecs gefolgt wird. Während der MIME-Typ relativ einfach herauszufinden ist, können wir den Codec-String mithilfe des mp4info Tools ermitteln.
Derzeit haben MP4-Container mit H.264-Video- und AAC-Audio-Codecs Unterstützung in allen modernen Browsern, während andere nicht unterstützt werden.
Um unsere Beispielmedien von einem QuickTime MOV-Container in einen MP4-Container zu konvertieren, können wir ffmpeg verwenden. Da der Audiocodec im MOV-Container bereits AAC und der Videocodec h.264 ist, können wir ffmpeg anweisen, keine Transkodierung durchzuführen. Stattdessen wird es die Audio- und Videospuren einfach kopieren, ohne eine Transkodierung durchzuführen, was im Allgemeinen schneller ist als eine Transkodierung.
ffmpeg -i trailer_1080p.mov -c:v copy -c:a copy bunny.mp4
Ãberprüfung der Fragmentierung
Um MP4 korrekt streamen zu können, muss das Asset im ISO BMF Format MP4 vorliegen. Ohne eine ordnungsgemäÃe Fragmentierung ist nicht garantiert, dass eine gegebene MP4-Datei mit MSE funktioniert. Das bedeutet, dass Metadaten innerhalb des Containers verteilt sind und nicht zusammengefasst werden.
Um zu überprüfen, ob eine MP4-Datei ein ordnungsgemäÃer MP4-Stream ist, können Sie erneut das mp4info Tool verwenden, um die Atome eines MP4 aufzulisten.
Hinweis: Die fragmentierte Version ist aufgrund zusätzlicher Metadaten, die sich über die Datei verteilen, etwas gröÃer als das Original. Dies ist normalerweise eine DateigröÃenzunahme von 1 Prozent oder weniger.
FragmentierungWenn Sie ein Asset haben, das noch kein MP4 ist, kann ffmpeg ein ordnungsgemäÃes fragmentiertes MP4 während des Transkodierungsprozesses mit dem -movflags frag_keyframe+empty_moov
Befehlszeilenparameter erzeugen:
ffmpeg -i trailer_1080p.mov -c:v copy -c:a copy -movflags frag_keyframe+empty_moov bunny_fragmented.mp4
Wenn Sie bereits ein MP4 haben, das jedoch nicht ordnungsgemäà fragmentiert ist, können Sie erneut ffmpeg verwenden:
ffmpeg -i non_fragmented.mp4 -movflags frag_keyframe+empty_moov fragmented.mp4
In beiden Fällen erfordert Chrome möglicherweise, dass ein zusätzliches Movie-Flag gesetzt wird:
-movflags frag_keyframe+empty_moov+default_base_moof
Ein ordnungsgemäà fragmentiertes MP4 ist alles, was Sie benötigen, um loszulegen. Wenn Sie adaptives Bitraten-Streaming verwenden möchten, müssen Sie Encodings in mehreren Auflösungen erstellen. Während MSE flexibel genug ist, um Ihnen die Möglichkeit zu geben, Ihre Implementierung zu erstellen, wird dringend empfohlen, einen vorhandenen DASH-Client zu verwenden, da DASH ein gut spezifiziertes Anwendungsprotokoll ist.
Erstellung von Inhalten für DASHDa Sie ffmpeg und die Dienstprogramme von Bento4 über Ihr $PATH-Verzeichnis zugänglich haben, können Sie das mp4-dash-encode.py
Python-Skript von Bento4 ausführen, um mehrere Encodings Ihrer Inhalte in verschiedenen Auflösungen zu generieren. Das mp4-dash.py
Python-Skript von Bento4 kann dann verwendet werden, um die entsprechende MPD-Datei zu generieren, die von Clients benötigt wird.
Führen Sie die folgenden Befehle aus:
python mp4-dash-encode.py -b 5 -v bunny_fragmented.mp4
python mp4-dash.py video_0*
Dies sollte die folgenden Dateien ausgeben:
output âââ audio â âââ und âââ stream.mpd âââ video âââ 1 âââ 2 âââ 3 âââ 4 âââ 5
Hinweis:>mp4-dash-encode.py
zeigt keine ffmpeg-Fehlermeldungen an. Sie können es sehen, indem Sie die -d
Option angeben.
Hinweis: Wenn die Fehlermeldung "Invalid duration specification for force_key_frames: 'expr:eq(mod(n"
angezeigt wird, ändern Sie mp4-dash-encode.py
und entfernen Sie zwei "'"
aus "-force_key_frames 'expr:eq(mod(n,%d),0)'"
.
Mit Ihren korrekt kodierten Videos und den erzeugten adaptiven Bitraten-Medien sind Sie nun bereit, auf das Web mit DASH und MSE zu streamen.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4