Start · Sprachen · JavaScript · Referenz · AudioData.duration

AudioData.duration

Eigenschaft

Schreibgeschützte Eigenschaft, die die Dauer eines <code>AudioData</code>-Objekts in Mikrosekunden als ganze Zahl liefert.

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

Signatur

AudioData.duration

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

Typ
number
Beschreibung
Ganze Zahl mit der Dauer des Audioabschnitts in Mikrosekunden. Nach 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();
10000 10 ms

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');
Block endet bei 0.020 s Block endet bei 0.040 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 durch 1e6 bzw. 1e3 teilen.
  • 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 numberOfFrames aufsummieren und erst am Ende umrechnen.
  • Nach close() liefert duration 0. Den Wert also vorher auslesen.
  • Kompatibilität: WebCodecs gibt es in Chromium-Browsern ab Version 94 und in Firefox ab 130. Safari unterstützt AudioData bisher nicht (Stand 2024). Die API steht nur in sicheren Kontexten (HTTPS) zur Verfügung, auch in Workern. Vorab prüfen mit 'AudioData' in globalThis.