Signatur
Beschreibung
Die Eigenschaft duration gehört zum Interface AudioData der WebCodecs API. Sie gibt an, wie lange der im Objekt enthaltene Audioabschnitt dauert, und zwar in Mikrosekunden (1 s = 1.000.000 µs). Der Wert ist schreibgeschützt und wird vom Browser aus numberOfFrames und sampleRate berechnet: duration = numberOfFrames / sampleRate × 1.000.000, auf eine ganze Zahl gerundet.
Gebraucht wird duration vor allem, wenn man Audio blockweise dekodiert oder kodiert und dabei eine Zeitachse verwalten muss, etwa um die Wiedergabeposition fortzuschreiben, Audio mit Video (VideoFrame.timestamp) zu synchronisieren oder beim Muxen die Zeitstempel aufeinanderfolgender Blöcke zu prüfen. Zusammen mit AudioData.timestamp ergibt sich das Ende eines Blocks aus timestamp + duration.
Wichtig: Die Einheit ist nicht Sekunden oder Millisekunden wie bei HTMLMediaElement.currentTime bzw. performance.now(). Für die Anzeige oder für die Web Audio API muss man den Wert daher umrechnen.
Rückgabewert
close() ist der Wert 0.Beispiele
Dauer eines selbst erzeugten AudioData-Objekts auslesen
// 480 Frames Stereo bei 48 kHz = 10 ms
const sampleRate = 48000;
const numberOfFrames = 480;
const numberOfChannels = 2;
const samples = new Float32Array(numberOfFrames * numberOfChannels);
const audio = new AudioData({
format: 'f32-planar',
sampleRate,
numberOfFrames,
numberOfChannels,
timestamp: 0,
data: samples
});
console.log(audio.duration); // Mikrosekunden
console.log(audio.duration / 1000, 'ms'); // Millisekunden
audio.close();
Gesamtdauer beim Dekodieren mitzählen
let totalMicros = 0;
const decoder = new AudioDecoder({
output: (audioData) => {
totalMicros += audioData.duration;
const end = audioData.timestamp + audioData.duration;
console.log(`Block endet bei ${(end / 1e6).toFixed(3)} s`);
audioData.close(); // Speicher sofort freigeben
},
error: (e) => console.error('Dekodierfehler:', e)
});
decoder.configure({ codec: 'opus', sampleRate: 48000, numberOfChannels: 2 });
// decoder.decode(new EncodedAudioChunk({...})) für jeden Chunk aufrufen
// await decoder.flush();
// console.log('Gesamt:', totalMicros / 1e6, 's');
Lücken zwischen aufeinanderfolgenden Blöcken erkennen
let expectedNext = null;
const checkContinuity = (audioData) => {
if (expectedNext !== null) {
const gap = audioData.timestamp - expectedNext;
if (Math.abs(gap) > 1) {
console.warn(`Lücke/Überlappung von ${gap} µs erkannt`);
}
}
expectedNext = audioData.timestamp + audioData.duration;
};
// Wichtig · Fallstricke
- Einheit Mikrosekunden: Häufiger Fehler ist die Verwechslung mit Sekunden (
AudioBuffer.duration,HTMLMediaElement.duration) oder Millisekunden. Zum Umrechnen durch1e6bzw.1e3teilen. - Rundung: Der Wert ist ganzzahlig. Bei Sampleraten wie 44.100 Hz entstehen kleine Rundungsfehler, die sich über viele Blöcke aufsummieren. Für eine exakte Zeitachse besser
numberOfFramesaufsummieren und erst am Ende umrechnen. - Nach
close()liefertduration0. Den Wert also vorher auslesen. - Kompatibilität: WebCodecs gibt es in Chromium-Browsern ab Version 94 und in Firefox ab 130. Safari unterstützt
AudioDatabisher nicht (Stand 2024). Die API steht nur in sicheren Kontexten (HTTPS) zur Verfügung, auch in Workern. Vorab prüfen mit'AudioData' in globalThis.