Start · Sprachen · JavaScript · Referenz · BufferedChangeEvent.removedRanges

BufferedChangeEvent.removedRanges

Eigenschaft

Schreibgeschützte Eigenschaft, die ein <code>TimeRanges</code>-Objekt mit den Zeitbereichen liefert, die aus einem <code>ManagedSourceBuffer</code> entfernt wurden.

seit JavaScript Experimentell: Safari 17+ (macOS), Safari auf iOS Kategorie: webapi

Signatur

BufferedChangeEvent.removedRanges

Beschreibung

Die Eigenschaft removedRanges gehört zum Interface BufferedChangeEvent der Managed Media Source API. Ein solches Ereignis vom Typ bufferedchange wird auf einem ManagedSourceBuffer ausgelöst, wenn sich dessen gepufferte Bereiche ändern. removedRanges liefert dabei ein TimeRanges-Objekt mit genau den Zeitabschnitten (in Sekunden), die aus dem Puffer verschwunden sind.

Anders als beim klassischen SourceBuffer darf der Browser bei ManagedMediaSource gepufferte Mediendaten selbstständig entfernen, etwa wenn der Speicher knapp wird. Genau diese Fälle meldet removedRanges. Aber auch Daten, die das eigene Skript mit SourceBuffer.remove() gelöscht hat, tauchen hier auf. Für einen Streaming-Player ist das wichtig: Wurden Bereiche entfernt, die noch abgespielt werden sollen, muss er die passenden Segmente erneut laden.

Das zurückgegebene Objekt ist nicht live, es gibt also den Stand zum Zeitpunkt des Ereignisses wieder. Den einzelnen Bereich i liest man mit start(i) und end(i) aus, die Anzahl der Bereiche steht in length. Wurde nichts entfernt, ist length gleich 0.

Rückgabewert

Typ
TimeRanges
Beschreibung
Ein TimeRanges-Objekt mit den entfernten Zeitbereichen in Sekunden. Wurde nichts entfernt, ist length gleich 0.

Beispiele

Entfernte Bereiche protokollieren

const video = document.querySelector('video');
const MS = window.ManagedMediaSource ?? window.MediaSource;
const source = new MS();

video.disableRemotePlayback = true; // für ManagedMediaSource ohne AirPlay-Quelle erforderlich
video.src = URL.createObjectURL(source);

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

  sb.addEventListener('bufferedchange', (event) => {
    const { removedRanges } = event;
    for (let i = 0; i < removedRanges.length; i++) {
      console.log(`Entfernt: ${removedRanges.start(i).toFixed(2)}s – ${removedRanges.end(i).toFixed(2)}s`);
    }
  });
});
Entfernt: 0.00s – 12.00s

Nachladen, wenn der Browser Daten vor der Abspielposition verwirft

const refetchSegments = async (sb, start, end) => {
  // eigene Logik: Segmente für [start, end] erneut laden und anhängen
  console.log(`Lade neu: ${start}s bis ${end}s`);
};

const handleBufferedChange = (event) => {
  const video = document.querySelector('video');
  const { removedRanges } = event;

  for (let i = 0; i < removedRanges.length; i++) {
    const start = removedRanges.start(i);
    const end = removedRanges.end(i);
    // Nur relevant, wenn der Bereich noch vor uns liegt
    if (end > video.currentTime) {
      refetchSegments(event.target, Math.max(start, video.currentTime), end);
    }
  }
};

// sb ist ein ManagedSourceBuffer
// sb.onbufferedchange = handleBufferedChange;
Lade neu: 30.5s bis 45s

Ereignis manuell erzeugen (z. B. für Tests)

if ('BufferedChangeEvent' in window) {
  const video = document.createElement('video');
  const event = new BufferedChangeEvent('bufferedchange', {
    removedRanges: video.buffered // leeres TimeRanges-Objekt
  });
  console.log(event.removedRanges.length);
} else {
  console.log('BufferedChangeEvent wird nicht unterstützt');
}

// Wichtig · Fallstricke

  • Kompatibilität: Die Managed Media Source API ist experimentell. Unterstützt wird sie derzeit vor allem von Safari (ab 17, auf dem iPhone ab iOS 17.1). Prüfe deshalb vor der Nutzung mit 'ManagedMediaSource' in window und greife sonst auf MediaSource zurück. Dort gibt es kein bufferedchange.
  • Bei ManagedMediaSource kann der Browser gepufferte Daten jederzeit verwerfen. Verlass dich also nicht darauf, dass einmal angehängte Segmente erhalten bleiben. Werte removedRanges aus und lade fehlende Bereiche nach.
  • Das TimeRanges-Objekt ist eine Momentaufnahme. Den aktuellen Pufferzustand liefert sourceBuffer.buffered.
  • Auf iOS funktioniert ManagedMediaSource nur, wenn entweder video.disableRemotePlayback = true gesetzt ist oder eine alternative Quelle für AirPlay angegeben wird. Sonst wird die Quelle nicht geöffnet.
  • Ein Zugriff auf start(i) oder end(i) mit ungültigem Index wirft einen IndexSizeError.