Signatur
Beschreibung
Die schreibgeschützte Eigenschaft sourceBuffers einer MediaSource gibt eine SourceBufferList zurück. Darin stehen alle SourceBuffer-Objekte, die mit MediaSource.addSourceBuffer() angelegt und noch nicht mit removeSourceBuffer() entfernt wurden. Typisch ist ein Puffer für Video und ein zweiter für Audio, etwa bei getrennten DASH- oder HLS-Spuren.
Die Liste ist live: Sie ändert sich automatisch, wenn Puffer hinzukommen oder wegfallen. Jede Änderung löst auf der Liste ein Ereignis aus, entweder addsourcebuffer oder removesourcebuffer. Auf die einzelnen Einträge greifen Sie über den Index zu (sourceBuffers[0]) oder über length. Die Liste lässt sich auch mit for...of bzw. Array.from() durchlaufen.
In der Praxis brauchen Sie sourceBuffers vor allem für Verwaltungsaufgaben, zum Beispiel:
- prüfen, ob gerade ein Puffer aktualisiert wird (
updating), bevor SieendOfStream()aufrufen oder die Dauer ändern, - gepufferte Zeitbereiche (
buffered) auswerten, - beim Aufräumen alle Puffer entfernen.
Im Unterschied dazu enthält activeSourceBuffers nur die Puffer, die gerade eine ausgewählte Video- oder aktivierte Audio- bzw. Textspur liefern.
Rückgabewert
SourceBuffer-Objekte dieser MediaSource. Sie ist leer, solange noch kein Puffer angelegt wurde.Beispiele
Puffer anlegen und die Liste auslesen
const video = document.querySelector('video');
const mediaSource = new MediaSource();
video.src = URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', () => {
console.log(mediaSource.sourceBuffers.length); // noch leer
mediaSource.addSourceBuffer('video/mp4; codecs="avc1.42E01E"');
mediaSource.addSourceBuffer('audio/mp4; codecs="mp4a.40.2"');
console.log(mediaSource.sourceBuffers.length);
console.log(mediaSource.sourceBuffers[0] instanceof SourceBuffer);
});
endOfStream() erst aufrufen, wenn kein Puffer mehr aktualisiert wird
const waitForIdle = (mediaSource) => {
const busy = Array.from(mediaSource.sourceBuffers).filter((sb) => sb.updating);
return Promise.all(
busy.map((sb) => new Promise((resolve) =>
sb.addEventListener('updateend', resolve, { once: true })
))
);
};
const finishStream = async (mediaSource) => {
await waitForIdle(mediaSource);
if (mediaSource.readyState === 'open') {
mediaSource.endOfStream();
console.log('Stream beendet:', mediaSource.readyState);
}
};
Auf Änderungen der Liste reagieren und aufräumen
const mediaSource = new MediaSource();
const list = mediaSource.sourceBuffers;
list.addEventListener('addsourcebuffer', () => {
console.log('Puffer hinzugefügt, jetzt:', list.length);
});
list.onremovesourcebuffer = () => {
console.log('Puffer entfernt, jetzt:', list.length);
};
const cleanup = () => {
// Kopie anlegen, weil sich die Live-Liste beim Entfernen verkleinert
for (const sb of Array.from(mediaSource.sourceBuffers)) {
if (sb.updating) sb.abort();
mediaSource.removeSourceBuffer(sb);
}
};
// Wichtig · Fallstricke
- Live-Liste: Wenn Sie in einer Index-Schleife Puffer entfernen, verschieben sich die Indizes. Kopieren Sie die Liste deshalb vorher mit
Array.from(). - Kein Array:
SourceBufferListhat wedermapnochfilter. Für diese Methoden müssen Sie die Liste zuerst umwandeln. - Schreibgeschützt: Eine Zuweisung an
sourceBufferswird ignoriert, im Strict Mode löst sie einenTypeErroraus. Puffer ändern Sie nur überaddSourceBuffer()undremoveSourceBuffer(). - Zeitpunkt:
addSourceBuffer()funktioniert nur, wennreadyStateden Wert'open'hat. Warten Sie daher auf das Ereignissourceopen. - Kompatibilität: Die Eigenschaft wird von Chrome, Edge, Firefox und Safari auf dem Desktop unterstützt. Auf dem iPhone steht sie erst ab iOS 17.1 zur Verfügung, und zwar über
ManagedMediaSource. In Dedicated Workers gibt es sie nur in neueren Chromium-Versionen. Prüfen Sie die Unterstützung mit'MediaSource' in window.