Start · Sprachen · JavaScript · Referenz · SourceBuffer.textTracks

SourceBuffer.textTracks

Eigenschaft

Gibt eine schreibgeschützte <code>TextTrackList</code> mit den Textspuren zurück, die aktuell in diesem <code>SourceBuffer</code> enthalten sind.

seit JavaScript Experimentell: kaum Browser-Unterstützung (Stand: Kategorie: webapi

Signatur

get SourceBuffer.textTracks

Beschreibung

Die Eigenschaft textTracks gehört zur Media Source Extensions API (MSE). Sie liefert eine TextTrackList mit allen Textspuren (z. B. Untertitel, Bildunterschriften, Kapitel oder Metadaten), die aus den an diesen SourceBuffer angehängten Mediensegmenten stammen. Die Spuren entstehen, wenn ein Initialisierungssegment mit Textspuren über appendBuffer() eingelesen wird.

Nützlich ist die Eigenschaft vor allem in eigenen Streaming-Playern (adaptives Streaming mit fragmentiertem MP4 oder WebM), wenn man wissen möchte, aus welchem Puffer eine bestimmte Textspur stammt. Die gleichen Spuren tauchen zusätzlich in HTMLMediaElement.textTracks des zugehörigen <video>- oder <audio>-Elements auf, dort allerdings gemischt mit Spuren aus <track>-Elementen und anderen Puffern.

Die Liste ist schreibgeschützt: Die Eigenschaft selbst kann nicht neu zugewiesen werden. Die enthaltenen TextTrack-Objekte lassen sich aber normal steuern, z. B. über track.mode = "showing". Über die Ereignisse addtrack und removetrack der TextTrackList erfährt man, wann Spuren hinzukommen oder entfernt werden.

Rückgabewert

Typ
TextTrackList
Beschreibung
Eine live aktualisierte TextTrackList mit den TextTrack-Objekten dieses Puffers. Ist die Liste leer, enthält der Puffer (noch) keine Textspuren.

Beispiele

Textspuren eines SourceBuffers auflisten (mit Feature-Erkennung)

const video = document.querySelector('video');
const mediaSource = new MediaSource();
video.src = URL.createObjectURL(mediaSource);

mediaSource.addEventListener('sourceopen', async () => {
  const mime = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';
  const sourceBuffer = mediaSource.addSourceBuffer(mime);

  // Initialisierungssegment laden und anhängen
  const init = await fetch('/media/init.mp4').then((r) => r.arrayBuffer());
  sourceBuffer.appendBuffer(init);

  sourceBuffer.addEventListener('updateend', () => {
    if (!('textTracks' in sourceBuffer)) {
      console.log('SourceBuffer.textTracks wird nicht unterstützt');
      return;
    }
    for (const track of sourceBuffer.textTracks) {
      console.log(`${track.kind}: ${track.label} (${track.language})`);
    }
  }, { once: true });
});
subtitles: Deutsch (de) captions: English CC (en)

Deutsche Untertitel automatisch einblenden

const showGermanSubtitles = (sourceBuffer) => {
  const tracks = sourceBuffer.textTracks;
  if (!tracks) return false;

  let found = false;
  for (const track of tracks) {
    const isGerman = track.language === 'de' && track.kind === 'subtitles';
    track.mode = isGerman ? 'showing' : 'disabled';
    if (isGerman) found = true;
  }
  return found;
};

// Aufruf z. B. nach dem ersten 'updateend'
console.log(showGermanSubtitles(sourceBuffer));
true

Auf neu hinzukommende Spuren reagieren

if (sourceBuffer.textTracks) {
  sourceBuffer.textTracks.addEventListener('addtrack', (event) => {
    const { track } = event;
    console.log('Neue Textspur:', track.label || track.id);
    track.mode = 'hidden'; // Cues laden, aber nicht anzeigen
    track.addEventListener('cuechange', () => {
      const cue = track.activeCues?.[0];
      if (cue) console.log('Aktueller Cue:', cue.text);
    });
  });
}
Neue Textspur: Deutsch Aktueller Cue: Hallo und willkommen!

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Die Eigenschaft ist in der MSE-Spezifikation definiert, wird aber von Chrome, Edge und Firefox nicht implementiert (Wert undefined). Unterstützung gibt es höchstens in WebKit/Safari. Immer per 'textTracks' in sourceBuffer prüfen und auf video.textTracks ausweichen.
  • Die Liste ist erst gefüllt, nachdem ein Initialisierungssegment mit Textspuren verarbeitet wurde – also frühestens nach dem ersten updateend-Ereignis.
  • Wird der Puffer mit MediaSource.removeSourceBuffer() entfernt, verschwinden seine Spuren auch aus HTMLMediaElement.textTracks.
  • Viele Streaming-Bibliotheken (hls.js, dash.js, Shaka Player) verarbeiten Untertitel nicht über In-Band-Spuren im SourceBuffer, sondern laden WebVTT separat und erzeugen Spuren per addTextTrack(). In diesem Fall bleibt sourceBuffer.textTracks leer.
  • In der Spezifikation ist die Eigenschaft als experimentell gekennzeichnet und kann sich noch ändern.