Start · Sprachen · JavaScript · Referenz · BufferedChangeEvent.addedRanges

BufferedChangeEvent.addedRanges

Eigenschaft

Schreibgeschützte Eigenschaft, die ein <code>TimeRanges</code>-Objekt mit den Zeitspannen liefert, die dem zugehörigen <code>ManagedSourceBuffer</code> hinzugefügt wurden.

seit JavaScript Managed Media Source (MSE-Erweiterung): Safari 17+ Kategorie: webapi

Signatur

BufferedChangeEvent.addedRanges

Beschreibung

Die Eigenschaft addedRanges gehört zum BufferedChangeEvent, das ein ManagedSourceBuffer als bufferedchange-Ereignis auslöst, sobald sich sein gepufferter Bereich ändert. Sie enthält ein TimeRanges-Objekt mit genau den Zeitspannen (in Sekunden), die seit der letzten Änderung neu in den Puffer gekommen sind, z. B. nach einem erfolgreichen appendBuffer().

Damit lässt sich der Puffer-Füllstand verfolgen, ohne bei jeder Änderung das komplette buffered-Attribut mit dem vorherigen Stand vergleichen zu müssen. Das ist nützlich für Fortschrittsanzeigen, Diagnose-Logs oder eigene Streaming-Logik, die entscheidet, welche Segmente als Nächstes geladen werden.

Das Gegenstück ist removedRanges. Dort stehen die Spannen, die entfernt wurden, entweder durch remove() oder, was bei Managed Media Source typisch ist, durch den Browser selbst, wenn er Speicher freigibt. Ist nichts hinzugekommen, ist addedRanges ein leeres TimeRanges-Objekt (length === 0).

Rückgabewert

Typ
TimeRanges
Beschreibung
Ein schreibgeschütztes TimeRanges-Objekt. Über length, start(i) und end(i) liest man die neu gepufferten Zeitspannen in Sekunden aus. Wenn nichts hinzugefügt wurde, ist das Objekt leer.

Beispiele

Neu gepufferte Bereiche protokollieren

const video = document.querySelector('video');

if ('ManagedMediaSource' in window) {
  const source = new ManagedMediaSource();
  video.disableRemotePlayback = true; // bei MMS in Safari für das Abspielen erforderlich
  video.src = URL.createObjectURL(source);

  source.addEventListener('sourceopen', () => {
    const sb = source.addSourceBuffer('video/mp4; codecs="avc1.42E01E"');

    sb.addEventListener('bufferedchange', (event) => {
      const { addedRanges } = event;
      for (let i = 0; i < addedRanges.length; i++) {
        console.log(`Hinzugefügt: ${addedRanges.start(i).toFixed(2)}s – ${addedRanges.end(i).toFixed(2)}s`);
      }
    });
  });
}
Hinzugefügt: 0.00s – 4.00s Hinzugefügt: 4.00s – 8.00s

Hilfsfunktion: TimeRanges in ein Array umwandeln

const rangesToArray = (ranges) =>
  Array.from({ length: ranges.length }, (_, i) => [ranges.start(i), ranges.end(i)]);

sourceBuffer.onbufferedchange = (event) => {
  const added = rangesToArray(event.addedRanges);
  const removed = rangesToArray(event.removedRanges);
  console.log({ added, removed });
};
{ added: [[8, 12]], removed: [] }

Gesamte neu gepufferte Dauer für eine Statistik summieren

let totalBufferedSeconds = 0;

const onBufferedChange = (event) => {
  const { addedRanges } = event;
  for (let i = 0; i < addedRanges.length; i++) {
    totalBufferedSeconds += addedRanges.end(i) - addedRanges.start(i);
  }
  console.log(`Bisher geladen: ${totalBufferedSeconds.toFixed(1)} s`);
};

sourceBuffer.addEventListener('bufferedchange', onBufferedChange);
// Später aufräumen:
// sourceBuffer.removeEventListener('bufferedchange', onBufferedChange);
Bisher geladen: 4.0 s Bisher geladen: 8.0 s

// Wichtig · Fallstricke

  • Kompatibilität: BufferedChangeEvent und ManagedMediaSource werden bisher vor allem von Safari (ab 17, iOS ab 17.1) unterstützt. Prüfe die Unterstützung mit 'ManagedMediaSource' in window und nutze sonst die klassische MediaSource ohne dieses Ereignis.
  • Nur die Differenz: addedRanges enthält lediglich die neuen Spannen, nicht den ganzen Puffer. Den aktuellen Gesamtstand liefert sourceBuffer.buffered.
  • Grenzen: Wenn du start(i) oder end(i) mit einem Index >= length aufrufst, wird eine IndexSizeError-DOMException ausgelöst. Prüfe length immer vorher.
  • Die Eigenschaft ist schreibgeschützt. Zuweisungen werden ignoriert, im Strict Mode gibt es einen TypeError.
  • Werte sind Gleitkommazahlen. Rundungsabweichungen im Bereich von Millisekunden an Segmentgrenzen sind normal.