Start · Sprachen · JavaScript · Referenz · AudioDecoder.decodeQueueSize

AudioDecoder.decodeQueueSize

Eigenschaft

Schreibgeschützte Ganzzahl mit der Anzahl der Dekodierungsanforderungen, die im <code>AudioDecoder</code> noch auf ihre Verarbeitung warten.

seit JavaScript WebCodecs API – Chrome/Edge 94+, Safari 26+, Firef Kategorie: webapi

Signatur

AudioDecoder.decodeQueueSize

Beschreibung

Die Eigenschaft decodeQueueSize gibt an, wie viele Aufrufe von AudioDecoder.decode() in der internen Warteschlange des Decoders stehen und noch nicht an den zugrunde liegenden Codec übergeben wurden. Jeder decode()-Aufruf erhöht den Wert um eins. Sobald der Decoder eine Anforderung übernimmt, sinkt der Wert wieder.

Wichtig ist die Eigenschaft vor allem für Gegendruck (Backpressure). Wer Audiodaten schneller in decode() schiebt, als der Codec sie verarbeiten kann, füllt den Speicher und erhöht die Latenz. Deshalb prüft man decodeQueueSize vor dem Einreihen weiterer Chunks. Zusammen mit dem Ereignis dequeue lässt sich so eine Zufuhr bauen, die sich selbst regelt.

Der Wert ist rein informativ. Er wird asynchron aktualisiert, und zwar immer dann, wenn der Decoder Arbeit aus der Warteschlange nimmt. Nach reset() oder close() ist er 0.

Rückgabewert

Typ
number
Beschreibung
Eine nicht-negative Ganzzahl: die Anzahl der ausstehenden Dekodierungsanforderungen in der Warteschlange.

Beispiele

Warteschlangengröße nach decode() auslesen

const decoder = new AudioDecoder({
  output: (audioData) => {
    console.log('Dekodiert:', audioData.numberOfFrames, 'Frames');
    audioData.close();
  },
  error: (e) => console.error('Decoder-Fehler:', e)
});

decoder.configure({ codec: 'opus', sampleRate: 48000, numberOfChannels: 2 });

// Codierte Opus-Pakete, z. B. aus einem Demuxer
const packets = [new Uint8Array([0xfc, 0xff, 0xfe]), new Uint8Array([0xfc, 0xff, 0xfe])];

let timestamp = 0;
for (const data of packets) {
  decoder.decode(new EncodedAudioChunk({ type: 'key', timestamp, data }));
  timestamp += 20000; // 20 ms in Mikrosekunden
}

console.log('Ausstehend:', decoder.decodeQueueSize);
Ausstehend: 2 (Wert variiert je nach Verarbeitungsgeschwindigkeit)

Gegendruck mit dem dequeue-Ereignis

const MAX_QUEUE = 10;

const feedDecoder = (decoder, chunks) => {
  let index = 0;

  const pump = () => {
    // Nur nachliefern, solange die Warteschlange klein genug ist
    while (index < chunks.length && decoder.decodeQueueSize < MAX_QUEUE) {
      decoder.decode(chunks[index++]);
    }
    if (index >= chunks.length) {
      decoder.removeEventListener('dequeue', pump);
      decoder.flush().then(() => console.log('Alle Chunks dekodiert'));
    }
  };

  decoder.addEventListener('dequeue', pump);
  pump();
};
Alle Chunks dekodiert

Asynchrones Warten, bis die Warteschlange abgebaut ist

const waitForQueue = (decoder, limit) =>
  new Promise((resolve) => {
    if (decoder.decodeQueueSize <= limit) return resolve();
    const onDequeue = () => {
      if (decoder.decodeQueueSize <= limit) {
        decoder.removeEventListener('dequeue', onDequeue);
        resolve();
      }
    };
    decoder.addEventListener('dequeue', onDequeue);
  });

const decodeAll = async (decoder, chunks) => {
  for (const chunk of chunks) {
    await waitForQueue(decoder, 5);
    decoder.decode(chunk);
  }
  await decoder.flush();
  console.log('Fertig, Warteschlange:', decoder.decodeQueueSize);
};
Fertig, Warteschlange: 0

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wird still ignoriert bzw. wirft im Strict Mode einen TypeError.
  • Kein Maß für fertige Ausgabe: Der Wert zählt nur Anforderungen, die noch nicht an den Codec übergeben wurden. Wenn 0 steht, können trotzdem noch Frames in Arbeit sein. Um sicher zu gehen, dass alle Ausgaben da sind, auf flush() warten.
  • Kein Polling: Statt den Wert mit setInterval abzufragen, das Ereignis dequeue nutzen (addEventListener('dequeue', …) oder ondequeue).
  • Nach reset() oder close() ist der Wert 0, und ausstehende Anforderungen werden verworfen.
  • Kompatibilität: Die WebCodecs API gibt es nur in sicheren Kontexten (HTTPS), im Fenster und in Dedicated Workers. Vor der Nutzung mit 'AudioDecoder' in globalThis prüfen. Die Unterstützung in Firefox und Safari ist jünger als in Chromium-Browsern.