Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
MediaSource
Eingeschränkt verfügbar
Diese Funktion ist nicht Baseline, da sie in einigen der am weitesten verbreiteten Browser nicht funktioniert.
Want more support for this feature? Tell us why.
Hinweis: Diese Funktion ist in Dedicated Web Workers verfügbar.
Das MediaSource-Interface der Media Source Extensions API repräsentiert eine Quelle für Mediendaten für ein HTMLMediaElement-Objekt. Ein MediaSource-Objekt kann an ein HTMLMediaElement angehängt werden, um im Benutzeragenten abgespielt zu werden.
Konstruktor
MediaSource()-
Erstellt und gibt ein neues
MediaSource-Objekt ohne zugehörige Quellpuffer zurück.
Instanz-Eigenschaften
MediaSource.activeSourceBuffersSchreibgeschützt-
Gibt ein
SourceBufferList-Objekt zurück, welches eine Teilmenge derSourceBuffer-Objekte enthält, die inMediaSource.sourceBuffersenthalten sind — die Liste der Objekte, die den ausgewählten Videotrack, aktivierte Audiotracks und angezeigte/verborgene Texttracks bereitstellen. MediaSource.duration-
Ruft die Dauer der aktuell präsentierten Medien ab oder setzt sie.
MediaSource.handleSchreibgeschützt-
Gibt innerhalb eines dedizierten Workers ein
MediaSourceHandle-Objekt zurück, ein Stellvertreter für dieMediaSource, der vom Worker zurück an den Hauptthread übertragen und über dieHTMLMediaElement.srcObject-Eigenschaft an ein Medienelement angehängt werden kann. MediaSource.readyStateSchreibgeschützt-
Gibt ein Enum zurück, das den Zustand der aktuellen
MediaSourcerepräsentiert, ob sie aktuell nicht an ein Medienelement angehängt ist (closed), angehängt und bereit ist, umSourceBuffer-Objekte zu empfangen (open), oder angehängt, aber der Stream überMediaSource.endOfStream()beendet wurde (ended). MediaSource.sourceBuffersSchreibgeschützt-
Gibt ein
SourceBufferList-Objekt zurück, das die Liste derSourceBuffer-Objekte enthält, die mit dieserMediaSourceverbunden sind.
Statische Eigenschaften
MediaSource.canConstructInDedicatedWorkerSchreibgeschützt-
Ein Boolescher Wert; gibt
truezurück, wenn dieMediaSource-Worker-Unterstützung implementiert ist, wodurch ein Mechanismus zur Erkennung dieser Funktion mit geringer Latenz bereitgestellt wird.
Instanz-Methoden
Erbt Methoden von seinem übergeordneten Interface, EventTarget.
MediaSource.addSourceBuffer()-
Erstellt einen neuen
SourceBufferdes angegebenen MIME-Typs und fügt ihn der ListeMediaSource.sourceBuffershinzu. MediaSource.clearLiveSeekableRange()-
Löscht einen, mit einem Aufruf von
setLiveSeekableRange()zuvor gesetzten, suchbaren Bereich. MediaSource.endOfStream()-
Signalisiert das Ende des Streams.
MediaSource.removeSourceBuffer()-
Entfernt den angegebenen
SourceBufferaus der ListeMediaSource.sourceBuffers. MediaSource.setLiveSeekableRange()-
Legt den Bereich fest, in dem der Benutzer im Medienelement suchen kann.
Statische Methoden
MediaSource.isTypeSupported()-
Gibt einen booleschen Wert zurück, der angibt, ob der aktuelle Benutzeragent den angegebenen MIME-Typ unterstützt — das heißt, ob er erfolgreich
SourceBuffer-Objekte für diesen MIME-Typ erstellen kann.
Ereignisse
sourceclose-
Wird ausgelöst, wenn die
MediaSource-Instanz nicht mehr an ein Medienelement angehängt ist. sourceended-
Wird ausgelöst, wenn die
MediaSource-Instanz noch an ein Medienelement angehängt ist, aberendOfStream()aufgerufen wurde. sourceopen-
Wird ausgelöst, wenn ein Medienelement die
MediaSource-Instanz geöffnet hat und sie bereit ist, dass Daten an dieSourceBuffer-Objekte insourceBuffersangehängt werden.
Beispiele
>Vollständiges einfaches Beispiel
Das folgende einfache Beispiel lädt ein Video mit XMLHttpRequest und spielt es ab, sobald es möglich ist. Dieses Beispiel kann hier live angesehen werden (Sie können auch den Quellcode herunterladen für weitere Untersuchungen).
const video = document.querySelector("video");
const assetURL = "frag_bunny.mp4";
// Need to be specific for Blink regarding codecs
// ./mp4info frag_bunny.mp4 | grep Codec
const mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';
let mediaSource;
if ("MediaSource" in window && MediaSource.isTypeSupported(mimeCodec)) {
mediaSource = new MediaSource();
console.log(mediaSource.readyState); // closed
video.src = URL.createObjectURL(mediaSource);
mediaSource.addEventListener("sourceopen", sourceOpen);
} else {
console.error("Unsupported MIME type or codec: ", mimeCodec);
}
function sourceOpen() {
console.log(this.readyState); // open
const sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
fetchAB(assetURL, (buf) => {
sourceBuffer.addEventListener("updateend", () => {
mediaSource.endOfStream();
video.play();
console.log(mediaSource.readyState); // ended
});
sourceBuffer.appendBuffer(buf);
});
}
function fetchAB(url, cb) {
console.log(url);
const xhr = new XMLHttpRequest();
xhr.open("get", url);
xhr.responseType = "arraybuffer";
xhr.onload = () => {
cb(xhr.response);
};
xhr.send();
}
Erstellen einer MediaSource in einem dedizierten Worker und Übergeben an den Hauptthread
Die handle-Eigenschaft kann innerhalb eines dedizierten Workers aufgerufen werden, und das resultierende MediaSourceHandle-Objekt wird dann über einen postMessage()-Aufruf an den Thread übertragen, der den Worker erstellt hat (in diesem Fall der Hauptthread):
// Inside dedicated worker
let mediaSource = new MediaSource();
let handle = mediaSource.handle;
// Transfer the handle to the context that created the worker
postMessage({ arg: handle }, [handle]);
mediaSource.addEventListener("sourceopen", () => {
// Await sourceopen on MediaSource before creating SourceBuffers
// and populating them with fetched media — MediaSource won't
// accept creation of SourceBuffers until it is attached to the
// HTMLMediaElement and its readyState is "open"
});
Im Hauptthread erhalten wir das Handle über einen message-Ereignishandler, hängen es mit seiner HTMLMediaElement.srcObject-Eigenschaft an ein <video> und play das Video an:
worker.addEventListener("message", (msg) => {
let mediaSourceHandle = msg.data.arg;
video.srcObject = mediaSourceHandle;
video.play();
});
Hinweis:
MediaSourceHandles können nicht erfolgreich in einen oder über einen Shared Worker oder Service Worker übertragen werden.
Spezifikationen
| Spezifikation |
|---|
| Media Source ExtensionsTM> # mediasource> |
Browser-Kompatibilität
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.