Start · Sprachen · JavaScript · Referenz · HTMLMediaElement.buffered

HTMLMediaElement.buffered

Eigenschaft

Schreibgeschützte Eigenschaft, die ein neues, statisches und normiertes <code>TimeRanges</code>-Objekt mit den bereits gepufferten Zeitbereichen der Medienressource liefert.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

HTMLMediaElement.buffered

Beschreibung

Die Eigenschaft buffered eines <audio>- oder <video>-Elements zeigt, welche Abschnitte der Medienressource der Browser zum Zeitpunkt des Zugriffs schon geladen hat. Sie liefert ein TimeRanges-Objekt. Jeder Bereich darin hat einen Start- und einen Endzeitpunkt in Sekunden, die man mit start(i) und end(i) abfragt. Mit length erhält man die Anzahl der Bereiche.

Normiert bedeutet: Die Bereiche sind aufsteigend sortiert, überlappen sich nicht und grenzen nicht aneinander. Aneinanderstoßende Abschnitte werden zu einem Bereich zusammengefasst. Mehrere getrennte Bereiche gibt es zum Beispiel, wenn der Nutzer an eine Stelle springt (Seeking) und der Browser dort neu zu laden beginnt.

Statisch bedeutet: Das Objekt ist eine Momentaufnahme und aktualisiert sich nicht selbst. Wer den Ladefortschritt verfolgen will, etwa für einen Fortschrittsbalken im eigenen Player, liest buffered bei jedem progress- oder timeupdate-Event neu aus.

Typische Anwendungen sind Pufferanzeigen in eigenen Player-Oberflächen, die Prüfung, ob eine Sprungmarke schon ohne Nachladen abspielbar ist, und die Diagnose des Streamings, etwa zusammen mit Media Source Extensions.

Rückgabewert

Typ
TimeRanges
Beschreibung
Ein neues TimeRanges-Objekt mit den gepufferten Bereichen, Angaben in Sekunden. Ist noch nichts gepuffert, ist length gleich 0.

Beispiele

Gepufferte Bereiche auflisten

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

const logBuffered = () => {
  const ranges = video.buffered;
  for (let i = 0; i < ranges.length; i++) {
    console.log(`Bereich ${i}: ${ranges.start(i).toFixed(1)}s – ${ranges.end(i).toFixed(1)}s`);
  }
};

video.addEventListener('progress', logBuffered);
Bereich 0: 0.0s – 12.4s Bereich 1: 60.0s – 71.3s

Pufferanzeige für einen eigenen Player

const video = document.querySelector('#player');
const bar = document.querySelector('#buffer-bar');

const updateBufferBar = () => {
  const { buffered, currentTime, duration } = video;
  if (!Number.isFinite(duration) || buffered.length === 0) return;

  // Den Bereich suchen, in dem die aktuelle Abspielposition liegt
  for (let i = 0; i < buffered.length; i++) {
    if (buffered.start(i) <= currentTime && currentTime <= buffered.end(i)) {
      const percent = (buffered.end(i) / duration) * 100;
      bar.style.width = `${percent}%`;
      break;
    }
  }
};

video.addEventListener('progress', updateBufferBar);
video.addEventListener('timeupdate', updateBufferBar);

Prüfen, ob eine Zielzeit schon gepuffert ist

const isBuffered = (media, time) => {
  const { buffered } = media;
  for (let i = 0; i < buffered.length; i++) {
    if (time >= buffered.start(i) && time <= buffered.end(i)) return true;
  }
  return false;
};

const audio = document.querySelector('audio');
const target = 45;

if (isBuffered(audio, target)) {
  audio.currentTime = target; // Sprung ohne Nachladen
} else {
  console.log('Position noch nicht geladen – kurze Wartezeit möglich');
  audio.currentTime = target;
}
Position noch nicht geladen – kurze Wartezeit möglich

// Wichtig · Fallstricke

  • Momentaufnahme: Jeder Zugriff liefert ein neues Objekt. Wer eine Referenz speichert, sieht später keine Änderungen. Deshalb bei Bedarf neu auslesen.
  • start(i) und end(i) werfen einen IndexSizeError (DOMException), wenn der Index außerhalb von 0 bis length - 1 liegt. Vorher length prüfen.
  • Nicht davon ausgehen, dass es nur einen Bereich gibt: Nach Sprüngen im Medium entstehen oft mehrere getrennte Bereiche.
  • Bei Live-Streams kann duration den Wert Infinity haben. Prozentrechnungen deshalb mit Number.isFinite() absichern.
  • Browser können bereits geladene Daten wieder verwerfen, etwa bei Speicherknappheit oder bei MSE-Quellen. Bereiche können also auch schrumpfen.
  • Bei preload="none" ist bis zum Abspielstart meist nichts gepuffert.
  • Kompatibilität: Die Eigenschaft wird von allen modernen Browsern unterstützt. Wie oft das progress-Event feuert, unterscheidet sich je nach Browser.