Mit den HTML-Audio- und ‑Videoelementen können Sie Medien laden, decodieren und wiedergeben, indem Sie einfach eine src-URL angeben:
<video src='foo.webm'></video>
Das funktioniert gut bei einfachen Anwendungsfällen. Für Techniken wie adaptives Streaming bietet die Media Source Extensions API (MSE) jedoch mehr Kontrolle. Mit MSE können Streams in JavaScript aus Audio- oder Videosegmenten erstellt werden.
Sie können MSE unter simpl.info/mse ausprobieren:

Der folgende Code stammt aus diesem Beispiel.
Ein MediaSource
-Element stellt eine Medienquelle für ein Audio- oder Videoelement dar. Sobald ein MediaSource
-Objekt instanziiert und sein open
-Ereignis ausgelöst wurde, können SourceBuffer
s hinzugefügt werden. Sie dienen als Puffer für Media-Segmente:
var mediaSource = new MediaSource();
video.src = window.URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', function() {
var sourceBuffer =
mediaSource.addSourceBuffer('video/webm; codecs="vorbis,vp8"');
// Get video segments and append them to sourceBuffer.
}
Media-Segmente werden in ein Audio- oder Videoelement „gestreamt“, indem jedes Segment einem SourceBuffer
mit appendBuffer()
hinzugefügt wird. In diesem Beispiel wird ein Video vom Server abgerufen und dann mit den File APIs gespeichert:
reader.onload = function (e) {
sourceBuffer.appendBuffer(new Uint8Array(e.target.result));
if (i === NUM_CHUNKS - 1) {
mediaSource.endOfStream();
} else {
if (video.paused) {
// start playing after first chunk is appended
video.play();
}
readChunk(++i);
}
};
Wiedergabereihenfolge festlegen
In Chrome 50 wurde die Unterstützung für das Attribut SourceBuffer
mode
erweitert. Sie können jetzt angeben, dass Mediasegmente fortlaufend in der Reihenfolge wiedergegeben werden, in der sie angehängt wurden, unabhängig davon, ob die Mediasegmente anfangs diskontinuierliche Zeitstempel hatten.
Mit dem Attribut mode
können Sie die Wiedergabereihenfolge für Media-Segmente angeben. Das Attribut kann einen von zwei Werten annehmen:
- segments: Der Zeitstempel jedes Segments (der möglicherweise durch
timestampOffset
geändert wurde) bestimmt die Wiedergabereihenfolge, unabhängig davon, in welcher Reihenfolge die Segmente angehängt werden. - sequence: Die Reihenfolge der in der Media-Zeitachse gepufferten Segmente wird durch die Reihenfolge bestimmt, in der Segmente an
SourceBuffer
angehängt werden.
Wenn die Media-Segmente Zeitstempel haben, die aus Byte-Stream-Daten geparst werden, wenn sie an die SourceBuffer
angehängt werden, wird die mode
-Eigenschaft der SourceBuffer
auf segments gesetzt. Andernfalls wird mode
auf sequence gesetzt. Zeitstempel sind nicht optional. Sie müssen für die meisten Streamtypen vorhanden sein und dürfen für andere nicht vorhanden sein. Inband-Zeitstempel sind für Streamtypen, die sie enthalten, inhärent.
Das Festlegen des Attributs mode
ist optional. Bei Streams ohne Zeitstempel (audio/mpeg und audio/aac) kann mode
nur von segments zu sequence geändert werden. Wenn Sie versuchen, mode
von sequence zu segments zu ändern, wird ein Fehler ausgegeben. Bei Streams mit Zeitstempeln ist es möglich, zwischen Segmenten und Sequenz zu wechseln. In der Praxis würde dies jedoch wahrscheinlich zu unerwünschtem, schwer nachvollziehbarem oder schwer vorhersehbarem Verhalten führen.
Bei allen Streamtypen können Sie den Wert von segments in sequence ändern. Das bedeutet, dass Segmente in der Reihenfolge wiedergegeben werden, in der sie angehängt wurden, und neue Zeitstempel entsprechend generiert werden:
sourceBuffer.mode = 'sequence';
Wenn Sie den mode
-Wert auf sequence setzen, wird die kontinuierliche Medienwiedergabe sichergestellt, unabhängig davon, ob die Zeitstempel der Mediensegmente diskontinuierlich sind. Das kann z. B. der Fall sein, wenn es Probleme beim Muxen von Videos gab oder wenn (aus welchen Gründen auch immer) diskontinuierliche Segmente angehängt werden. Eine App kann timestampOffset
als Polyfill verwenden, um eine kontinuierliche Wiedergabe zu gewährleisten, sofern die richtigen Stream-Metadaten verfügbar sind. Der Modus sequence macht den Prozess jedoch einfacher und weniger fehleranfällig.
MSE-Apps und ‑Demos
Hier sehen Sie Beispiele für MSE in Aktion, allerdings ohne SourceBuffer.mode
-Manipulation:
- Media Source API
- Shaka Player: Videoplayer-Demo, in der MSE verwendet wird, um DASH mit der Shaka-JavaScript-Bibliothek zu implementieren
Unterstützte Browser
- Standardmäßig Chrome 50 und höher
- Weitere Informationen zu Firefox finden Sie im MDN.