Signatur
Beschreibung
Die schreibgeschützte Eigenschaft videoTracks liefert ein VideoTrackList-Objekt, das alle Videospuren der aktuell geladenen Medienressource enthält. Jede Spur ist ein VideoTrack mit Eigenschaften wie id, kind, label, language und selected.
Sinnvoll ist das bei Medien mit mehreren Videospuren, etwa einem Hauptvideo und einer Gebärdensprach-Spur, alternativen Kameraperspektiven oder einer Spur mit Audiodeskription. Anders als bei Audiospuren kann immer nur eine Videospur gleichzeitig ausgewählt sein: Setzt man selected = true auf eine Spur, werden alle anderen automatisch abgewählt. Den Index der aktiven Spur liefert videoTracks.selectedIndex (bzw. -1, wenn keine ausgewählt ist).
Die Liste wird dynamisch gefüllt, sobald die Metadaten geladen sind. Deshalb sollte man sie frühestens im Event loadedmetadata auswerten oder auf die Events addtrack, removetrack und change der VideoTrackList reagieren. Die Eigenschaft selbst lässt sich nicht neu zuweisen, die zurückgegebene Liste bleibt aber „live“.
Rückgabewert
VideoTrackList mit allen VideoTrack-Objekten des Elements. Bietet length, Indexzugriff, selectedIndex, getTrackById(id) sowie die Events addtrack, removetrack und change. Ohne Videospuren ist die Liste leer (length === 0).Beispiele
Videospuren nach dem Laden der Metadaten auflisten
const video = document.querySelector('video');
video.addEventListener('loadedmetadata', () => {
// Funktion prüfen, da die Unterstützung eingeschränkt ist
if (!('videoTracks' in video)) {
console.log('videoTracks wird nicht unterstützt');
return;
}
const tracks = video.videoTracks;
console.log(`Anzahl Videospuren: ${tracks.length}`);
for (const track of Array.from(tracks)) {
console.log(track.id, track.kind, track.label || '(ohne Label)', track.selected);
}
});
Auswahlmenü zum Umschalten der Videospur
const video = document.querySelector('video');
const select = document.querySelector('#video-spur');
const fillMenu = () => {
select.replaceChildren();
Array.from(video.videoTracks).forEach((track, index) => {
const option = new Option(track.label || `Spur ${index + 1}`, track.id);
option.selected = track.selected;
select.append(option);
});
};
if ('videoTracks' in video) {
video.videoTracks.addEventListener('addtrack', fillMenu);
video.videoTracks.addEventListener('removetrack', fillMenu);
select.addEventListener('change', () => {
const track = video.videoTracks.getTrackById(select.value);
// Nur eine Videospur kann aktiv sein – die übrigen werden automatisch abgewählt
if (track) track.selected = true;
});
}
Auf Spurwechsel reagieren
const video = document.querySelector('video');
if ('videoTracks' in video) {
video.videoTracks.onchange = () => {
const { selectedIndex } = video.videoTracks;
if (selectedIndex === -1) {
console.log('Keine Videospur aktiv');
return;
}
const active = video.videoTracks[selectedIndex];
console.log(`Aktive Spur: ${active.label} (${active.language || 'ohne Sprache'})`);
};
}
// Wichtig · Fallstricke
- Browser-Kompatibilität: Nur Safari unterstützt
videoTracksstandardmäßig. In Chrome ist die Eigenschaft nur mit dem Flag „Experimental Web Platform features“ verfügbar, in Firefox nur über die Einstellungmedia.track.enabled. Prüfen Sie die Unterstützung daher immer mit'videoTracks' in video, bevor Sie darauf zugreifen. - Die Liste ist vor
loadedmetadatain der Regel leer. Ein direkter Zugriff gleich nach dem Setzen vonsrcliefert also meistlength === 0. - Viele gängige Container (z. B. einfache MP4-/WebM-Dateien) enthalten nur eine einzige Videospur. Mehrere Spuren kommen vor allem bei HLS-Streams (Safari) oder speziell erstellten Dateien vor.
- Bei Media Source Extensions verweist
VideoTrack.sourceBufferauf den zugehörigenSourceBuffer. Die Spuren werden dann erst beim Anhängen der Initialisierungssegmente angelegt. VideoTrackListist array-ähnlich, aber kein echtes Array. Fürmap/filtervorherArray.from()verwenden.- Für Untertitel und Kapitel ist nicht
videoTrackszuständig, sonderntextTracks.