Start · Sprachen · JavaScript · Referenz · ImageTrackList.selectedTrack

ImageTrackList.selectedTrack

Eigenschaft

Nur lesbare Eigenschaft, die den aktuell ausgewählten <code>ImageTrack</code> einer <code>ImageTrackList</code> zurückgibt, oder <code>null</code>, wenn kein Track ausgewählt ist.

seit JavaScript WebCodecs API – Chrome/Edge 94+, Firefox 133+; Saf Kategorie: webapi

Signatur

ImageTrackList.selectedTrack

Beschreibung

ImageTrackList.selectedTrack gehört zur WebCodecs API. Eine ImageTrackList erhalten Sie über ImageDecoder.tracks. Sie enthält alle Bild-Tracks einer Bilddatei. Die meisten Formate haben genau einen Track. Manche Container (z. B. AVIF) können mehrere enthalten, etwa ein Standbild und eine Animation.

Die Eigenschaft liefert den Track, den der Decoder gerade verwendet. Aus ihm lesen Sie Metadaten wie animated, frameCount und repetitionCount. So entscheiden Sie zum Beispiel, ob Sie nur ein Einzelbild dekodieren oder eine Animationsschleife aufbauen. Alle späteren Aufrufe von ImageDecoder.decode() beziehen sich auf diesen Track.

Die Eigenschaft ist nur lesbar. Um den Track zu wechseln, setzen Sie selected = true auf einem anderen ImageTrack aus der Liste. Danach verweisen selectedTrack und selectedIndex auf den neuen Track. Die Liste ist erst gefüllt, wenn das Promise ImageTrackList.ready erfüllt ist. Vorher liefert selectedTrack in der Regel null.

Rückgabewert

Typ
ImageTrack | null
Beschreibung
Den aktuell ausgewählten ImageTrack, oder null, wenn (noch) kein Track ausgewählt ist.

Beispiele

Prüfen, ob ein Bild animiert ist

const response = await fetch('/bilder/lade-animation.gif');
const decoder = new ImageDecoder({
  data: response.body,
  type: 'image/gif'
});

// Warten, bis die Track-Informationen vorliegen
await decoder.tracks.ready;

const track = decoder.tracks.selectedTrack;
if (track) {
  console.log('Animiert:', track.animated);
  console.log('Wiederholungen:', track.repetitionCount);
}
Animiert: true Wiederholungen: Infinity

Alle Frames des ausgewählten Tracks auf ein Canvas zeichnen

const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');

const response = await fetch('/bilder/banner.webp');
const decoder = new ImageDecoder({ data: response.body, type: 'image/webp' });

// completed abwarten, damit frameCount endgültig ist
await decoder.completed;
const { frameCount } = decoder.tracks.selectedTrack;

for (let i = 0; i < frameCount; i++) {
  const { image } = await decoder.decode({ frameIndex: i });
  ctx.drawImage(image, 0, 0);
  const dauerMs = (image.duration ?? 100000) / 1000; // duration in Mikrosekunden
  image.close(); // VideoFrame sofort freigeben
  await new Promise((r) => setTimeout(r, dauerMs));
}

Auf einen anderen Track wechseln (z. B. bei AVIF)

const response = await fetch('/bilder/multi.avif');
const decoder = new ImageDecoder({ data: response.body, type: 'image/avif' });
await decoder.tracks.ready;

console.log('Vorher:', decoder.tracks.selectedIndex);

// Den ersten animierten Track suchen und auswählen
for (let i = 0; i < decoder.tracks.length; i++) {
  const t = decoder.tracks[i];
  if (t.animated) {
    t.selected = true; // selectedTrack ist schreibgeschützt, daher über selected wechseln
    break;
  }
}

console.log('Nachher:', decoder.tracks.selectedIndex);
console.log(decoder.tracks.selectedTrack.animated);
Vorher: 0 Nachher: 1 true

// Wichtig · Fallstricke

  • Erst nach tracks.ready verlässlich: Vorher ist die Liste leer und selectedTrack liefert null. Prüfen Sie den Wert, bevor Sie Eigenschaften davon lesen.
  • Schreibgeschützt: Eine Zuweisung an selectedTrack hat keine Wirkung. Im Strict Mode löst sie einen TypeError aus. Den Track wechseln Sie über ImageTrack.selected = true. Mit selected = false heben Sie die Auswahl auf, dann wird selectedTrack zu null.
  • Trackwechsel setzt den Decoder zurück: Laufende decode()-Aufrufe werden verworfen, deren Promises werden abgelehnt.
  • frameCount kann wachsen: Wenn die Daten als ReadableStream hereinkommen, ist frameCount erst nach decoder.completed endgültig.
  • Nach decoder.close() sind die Track-Objekte nicht mehr nutzbar.
  • Kompatibilität: ImageDecoder gibt es nur in Chromium-Browsern (ab 94) und im neueren Firefox, Safari unterstützt es nicht. Die API setzt einen sicheren Kontext (HTTPS) voraus und läuft auch in Workern. Prüfen Sie die Unterstützung vorher mit 'ImageDecoder' in self.