Start · Sprachen · JavaScript · Referenz · AudioEncoder.configure()

AudioEncoder.configure()

Methode

Reiht eine Steuerungsnachricht ein, die den <code>AudioEncoder</code> mit Codec, Abtastrate, Kanalzahl und Bitrate für die folgenden <code>encode()</code>-Aufrufe konfiguriert.

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

Signatur

AudioEncoder.prototype.configure(config)

Beschreibung

Mit configure() legt man fest, wie ein AudioEncoder rohe Audiodaten (AudioData) in komprimierte EncodedAudioChunk-Objekte umwandelt: welcher Codec verwendet wird (z. B. Opus oder AAC), mit welcher Abtastrate und Kanalzahl das Eingangssignal vorliegt und welche Zielbitrate gilt. Ohne vorherigen Aufruf von configure() wirft encode() einen InvalidStateError.

Die Methode arbeitet asynchron über eine Steuerungswarteschlange: Sie kehrt sofort zurück und setzt state auf "configured". Die eigentliche Konfiguration des Codecs geschieht im Hintergrund. Wird die Konfiguration dort nicht unterstützt, meldet der Encoder einen NotSupportedError über den error-Callback des Konstruktors und schließt sich danach (state === "closed").

configure() kann auch mehrmals aufgerufen werden, etwa um die Bitrate zur Laufzeit zu ändern. Chunks, die vorher eingereiht wurden, werden noch mit der alten Konfiguration codiert. Wer sicherstellen will, dass alle ausstehenden Daten ausgegeben wurden, ruft vorher await encoder.flush() auf. Vor dem Konfigurieren sollte man mit der statischen Methode AudioEncoder.isConfigSupported() prüfen, ob die gewünschte Konfiguration unterstützt wird.

Parameter

Name Typ Default Beschreibung
$config Pflicht Object (AudioEncoderConfig) Konfigurationsobjekt mit den folgenden Eigenschaften.
$config.codec Pflicht string Codec-Zeichenkette nach dem WebCodecs Codec Registry, z. B. "opus", "mp4a.40.2" (AAC-LC), "flac", "mp3".
$config.sampleRate Pflicht number Abtastrate des Eingangs in Hz, z. B. 48000. Muss zu den übergebenen AudioData-Objekten passen.
$config.numberOfChannels Pflicht number Anzahl der Audiokanäle, z. B. 1 (Mono) oder 2 (Stereo).
$config.bitrate number Zielbitrate in Bit pro Sekunde, z. B. 128000.
$config.bitrateMode "constant" | "variable" "variable" Konstante (CBR) oder variable Bitrate (VBR).
$config.opus Object Opus-spezifische Optionen: format ("opus" | "ogg"), frameDuration (µs, Standard 20000), complexity (0–10), packetlossperc, useinbandfec, usedtx, signal ("auto" | "music" | "voice"), application ("voip" | "audio" | "lowdelay").
$config.aac Object AAC-spezifische Optionen: format ("aac" = roh mit description in den Metadaten, "adts" = mit ADTS-Headern).

Rückgabewert

Typ
undefined
Beschreibung
Kein Rückgabewert. Ob die Konfiguration erfolgreich war, zeigt sich erst asynchron. Ein Fehler wird über den error-Callback gemeldet.

Beispiele

Opus-Encoder konfigurieren und Chunks sammeln

const chunks = [];

const encoder = new AudioEncoder({
  output: (chunk, metadata) => {
    chunks.push(chunk);
    if (metadata?.decoderConfig) {
      console.log('Decoder-Konfiguration:', metadata.decoderConfig.codec);
    }
  },
  error: (e) => console.error('Encoder-Fehler:', e.message),
});

encoder.configure({
  codec: 'opus',
  sampleRate: 48000,
  numberOfChannels: 2,
  bitrate: 128_000,
});

console.log(encoder.state);
configured

Unterstützung vorher mit isConfigSupported() prüfen

const config = {
  codec: 'mp4a.40.2', // AAC-LC
  sampleRate: 44100,
  numberOfChannels: 2,
  bitrate: 160_000,
  aac: { format: 'adts' },
};

const { supported } = await AudioEncoder.isConfigSupported(config);

if (supported) {
  const encoder = new AudioEncoder({
    output: (chunk) => console.log('Chunk:', chunk.byteLength, 'Bytes'),
    error: (e) => console.error(e),
  });
  encoder.configure(config);
} else {
  console.warn('AAC wird in diesem Browser nicht unterstützt.');
}

Mikrofon-Audio für Sprachübertragung codieren

const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const [track] = stream.getAudioTracks();
const { sampleRate, channelCount } = track.getSettings();

const encoder = new AudioEncoder({
  output: (chunk) => console.log(`${chunk.type} @ ${chunk.timestamp} µs`),
  error: (e) => console.error(e),
});

encoder.configure({
  codec: 'opus',
  sampleRate: sampleRate ?? 48000,
  numberOfChannels: channelCount ?? 1,
  bitrate: 32_000,
  opus: { application: 'voip', signal: 'voice', usedtx: true, useinbandfec: true },
});

// MediaStreamTrackProcessor: derzeit nur in Chromium-Browsern verfügbar
const processor = new MediaStreamTrackProcessor({ track });
const reader = processor.readable.getReader();

while (true) {
  const { value: audioData, done } = await reader.read();
  if (done) break;
  encoder.encode(audioData);
  audioData.close();
}
key @ 0 µs key @ 20000 µs ...

Bitrate zur Laufzeit ändern

const lowerBitrate = async (encoder) => {
  // Ausstehende Daten erst mit alter Konfiguration ausgeben
  await encoder.flush();
  encoder.configure({
    codec: 'opus',
    sampleRate: 48000,
    numberOfChannels: 2,
    bitrate: 48_000,
  });
  console.log('Neue Bitrate aktiv');
};
Neue Bitrate aktiv