Signatur
Beschreibung
Die Eigenschaft duration eines <audio>- oder <video>-Elements gibt die Länge des Mediums in Sekunden zurück. Der Wert ist eine Gleitkommazahl vom Typ double, zum Beispiel 127.453. Man braucht ihn für eigene Wiedergabesteuerungen: Fortschrittsbalken, Zeitanzeigen („1:23 / 4:56“) oder das Umrechnen einer Klickposition in eine Abspielposition für currentTime.
Wie verlässlich der Wert ist, hängt vom Ladezustand ab. Solange keine Metadaten vorliegen (readyState ist HAVE_NOTHING), ist duration gleich NaN. Sobald das Ereignis loadedmetadata ausgelöst wurde, steht der Wert zur Verfügung. Ändert sich die Dauer später, etwa weil der Browser die Länge beim Laden genauer bestimmt, wird das Ereignis durationchange gefeuert.
Bei Livestreams und anderen Medien ohne festes Ende ist der Wert Infinity. Die Eigenschaft kann nicht beschrieben werden. Wenn eine Quelle per Media Source Extensions eingespeist wird, legt man die Dauer stattdessen über MediaSource.duration fest.
Rückgabewert
NaN, bei Livestreams ohne definiertes Ende Infinity.Beispiele
Dauer nach dem Laden der Metadaten auslesen
const video = document.querySelector('video');
// Vor loadedmetadata wäre duration noch NaN
console.log('Vorher:', video.duration);
video.addEventListener('loadedmetadata', () => {
console.log(`Länge: ${video.duration.toFixed(2)} Sekunden`);
});
Zeitanzeige im Format mm:ss (auch für Livestreams)
const formatTime = (seconds) => {
if (Number.isNaN(seconds)) return '--:--';
if (!Number.isFinite(seconds)) return 'LIVE';
const m = Math.floor(seconds / 60);
const s = Math.floor(seconds % 60).toString().padStart(2, '0');
return `${m}:${s}`;
};
const audio = document.querySelector('audio');
const label = document.querySelector('#time');
const update = () => {
label.textContent = `${formatTime(audio.currentTime)} / ${formatTime(audio.duration)}`;
};
audio.addEventListener('timeupdate', update);
audio.addEventListener('durationchange', update);
Fortschrittsbalken mit Sprung per Klick
const video = document.querySelector('video');
const bar = document.querySelector('.progress');
const fill = bar.querySelector('.progress-fill');
video.addEventListener('timeupdate', () => {
if (!Number.isFinite(video.duration)) return;
const percent = (video.currentTime / video.duration) * 100;
fill.style.width = `${percent}%`;
});
bar.addEventListener('click', (event) => {
if (!Number.isFinite(video.duration)) return;
const rect = bar.getBoundingClientRect();
const ratio = (event.clientX - rect.left) / rect.width;
video.currentTime = ratio * video.duration;
});
Dauer einer Audiodatei ermitteln, ohne sie abzuspielen
const getAudioDuration = (url) => new Promise((resolve, reject) => {
const audio = new Audio();
audio.preload = 'metadata';
audio.addEventListener('loadedmetadata', () => resolve(audio.duration), { once: true });
audio.addEventListener('error', () => reject(audio.error), { once: true });
audio.src = url;
});
const seconds = await getAudioDuration('/media/podcast-folge-12.mp3');
console.log(`Folge dauert ${Math.round(seconds / 60)} Minuten`);
// Wichtig · Fallstricke
NaNvor dem Laden: Werdurationdirekt nach dem Setzen vonsrcausliest, bekommtNaN. Rechnungen wiecurrentTime / durationergeben dann ebenfallsNaN. Den Wert deshalb erst inloadedmetadatabzw.durationchangeauslesen oderreadyState >= 1prüfen.Infinitybei Streams: Bei Livestreams (z. B. HLS-Live oder Internetradio) ist der WertInfinity. MitNumber.isFinite()absichern, bevor man Prozentwerte berechnet odercurrentTimesetzt.- WebM/MediaRecorder: Mit
MediaRecordererzeugte WebM-Dateien enthalten oft keine Längenangabe. Chrome meldet dann anfangsInfinity. Ein bekannter Umweg:currentTimeauf einen sehr hohen Wert setzen und aufdurationchangewarten. - Ungenauigkeit: Bei MP3-Dateien mit variabler Bitrate schätzt der Browser die Dauer anfangs nur und korrigiert sie beim weiteren Laden. Deshalb auf
durationchangereagieren, statt den Wert einmalig zu speichern. - Schreibgeschützt: Eine Zuweisung wie
video.duration = 10wird ohne Fehlermeldung ignoriert. Im Strict Mode wirft sie einenTypeError, weil nur ein Getter existiert. - Kompatibilität: Wird von allen modernen Browsern seit vielen Jahren unterstützt. Unterschiede gibt es nur bei Randfällen wie Streams und Containern ohne Längenangabe.