Start · Sprachen · JavaScript · Referenz · AudioData.sampleRate

AudioData.sampleRate

Eigenschaft

Die schreibgeschützte Eigenschaft <code>AudioData.sampleRate</code> gibt die Abtastrate des Audio-Blocks in Hertz (Samples pro Sekunde und Kanal) als Gleitkommazahl zurück.

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

Signatur

AudioData.sampleRate

Beschreibung

sampleRate gehört zum Interface AudioData der WebCodecs API. Die Eigenschaft gibt an, mit wie vielen Samples pro Sekunde und Kanal die enthaltenen Audiodaten abgetastet wurden, z. B. 44100 oder 48000. Der Wert wird beim Erzeugen des Objekts festgelegt, entweder über das Init-Objekt des Konstruktors new AudioData(init) oder durch einen AudioDecoder.

Braucht man vor allem, um die Dauer eines Blocks auszurechnen (numberOfFrames / sampleRate), um Zeitstempel zu berechnen, Resampling vorzubereiten oder zu prüfen, ob die Daten zu einem AudioContext bzw. einer AudioEncoder-Konfiguration passen.

Die Eigenschaft ist schreibgeschützt. Eine andere Abtastrate bekommt man nur über ein neues AudioData-Objekt mit umgerechneten (resampelten) Daten. Nach close() ist das Objekt geschlossen, und sampleRate liefert dann 0.

Beispiele

AudioData erzeugen und Abtastrate auslesen

// 10 ms Stille in Stereo bei 48 kHz
const sampleRate = 48000;
const numberOfFrames = sampleRate / 100; // 480
const numberOfChannels = 2;

const audioData = new AudioData({
  format: 'f32-planar',
  sampleRate,
  numberOfFrames,
  numberOfChannels,
  timestamp: 0,
  data: new Float32Array(numberOfFrames * numberOfChannels)
});

console.log(audioData.sampleRate);
audioData.close();
48000

Dauer eines Blocks aus sampleRate berechnen

const describe = (audioData) => {
  const durationMs = (audioData.numberOfFrames / audioData.sampleRate) * 1000;
  return `${audioData.sampleRate} Hz, ${audioData.numberOfFrames} Frames = ${durationMs.toFixed(2)} ms`;
};

const chunk = new AudioData({
  format: 'f32',
  sampleRate: 44100,
  numberOfFrames: 1024,
  numberOfChannels: 1,
  timestamp: 0,
  data: new Float32Array(1024)
});

console.log(describe(chunk));
// Die Eigenschaft 'duration' liefert Mikrosekunden
console.log(chunk.duration);
chunk.close();
44100 Hz, 1024 Frames = 23.22 ms 23219

Dekodierte Daten mit dem AudioContext abgleichen

const ctx = new AudioContext();

const decoder = new AudioDecoder({
  output: (audioData) => {
    if (audioData.sampleRate !== ctx.sampleRate) {
      console.warn(`Resampling nötig: ${audioData.sampleRate} Hz → ${ctx.sampleRate} Hz`);
    }
    audioData.close(); // Speicher sofort freigeben
  },
  error: (e) => console.error('Dekodierfehler:', e)
});

decoder.configure({ codec: 'opus', sampleRate: 48000, numberOfChannels: 2 });
z. B.: Resampling nötig: 48000 Hz → 44100 Hz

Verhalten nach close()

const data = new AudioData({
  format: 's16',
  sampleRate: 16000,
  numberOfFrames: 160,
  numberOfChannels: 1,
  timestamp: 0,
  data: new Int16Array(160)
});

console.log(data.sampleRate);
data.close();
console.log(data.sampleRate);
16000 0

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wie audioData.sampleRate = 44100 wird ignoriert und wirft im Strict Mode einen TypeError. Resampling erfordert ein neues AudioData-Objekt.
  • Nach close() gibt die Eigenschaft 0. Wer mit sampleRate teilt, sollte deshalb vorher prüfen, ob das Objekt noch offen ist, sonst kommt Infinity bzw. NaN heraus.
  • Die Abtastrate gilt pro Kanal. Die Gesamtzahl der Samples ist numberOfFrames × numberOfChannels.
  • Ein Decoder kann eine andere Abtastrate ausgeben als konfiguriert. Opus wird zum Beispiel oft mit 48 kHz dekodiert. Lies deshalb immer sampleRate des Ausgabeobjekts aus.
  • Kompatibilität: WebCodecs gibt es nur in sicheren Kontexten (HTTPS) und in Window- sowie Worker-Umgebungen. Chromium unterstützt die API seit Version 94, Firefox seit 130. Safari unterstützt AudioData erst in neueren Versionen. Prüfe die Verfügbarkeit mit 'AudioData' in globalThis.