Start · Sprachen · JavaScript · Referenz · AudioBuffer.sampleRate

AudioBuffer.sampleRate

Eigenschaft

Liefert die Abtastrate (Samples pro Sekunde, als Gleitkommazahl) der im <code>AudioBuffer</code> gespeicherten PCM-Daten. Nur lesbar.

seit JavaScript Baseline: alle modernen Browser (Web Audio API) Kategorie: webapi

Signatur

AudioBuffer.sampleRate

Beschreibung

Die schreibgeschützte Eigenschaft sampleRate eines AudioBuffer gibt an, mit wie vielen Abtastwerten pro Sekunde (Hertz) die Audiodaten im Puffer vorliegen. Typische Werte sind 44100 (CD-Qualität) oder 48000 (Video- und Studio-Standard).

Der Wert wird beim Erzeugen des Puffers festgelegt, entweder über new AudioBuffer({ sampleRate, length, numberOfChannels }), über BaseAudioContext.createBuffer() oder beim Dekodieren mit decodeAudioData(). Im letzten Fall wird das Audio auf die Abtastrate des AudioContext umgerechnet, nicht auf die der Originaldatei.

Gebraucht wird sampleRate vor allem, wenn man Samples in Zeit umrechnen will oder umgekehrt, etwa zum Ausschneiden bestimmter Abschnitte, zum Erzeugen synthetischer Signale (Sinus, Rauschen), für Analysen oder beim Export als WAV-Datei. Es gilt: duration = length / sampleRate.

Beispiele

Abtastrate eines selbst erzeugten Puffers auslesen

const buffer = new AudioBuffer({
  numberOfChannels: 2,
  length: 22050,
  sampleRate: 44100
});

console.log(buffer.sampleRate);
console.log(buffer.duration); // length / sampleRate
44100 0.5

Sinuston mit korrekter Frequenz erzeugen

const ctx = new AudioContext();
const dauer = 1; // Sekunden
const buffer = ctx.createBuffer(1, ctx.sampleRate * dauer, ctx.sampleRate);
const daten = buffer.getChannelData(0);
const frequenz = 440; // Kammerton A

for (let i = 0; i < daten.length; i++) {
  // Zeit t = Sample-Index / sampleRate
  daten[i] = Math.sin(2 * Math.PI * frequenz * (i / buffer.sampleRate)) * 0.2;
}

const quelle = ctx.createBufferSource();
quelle.buffer = buffer;
quelle.connect(ctx.destination);
quelle.start();
console.log(`Abtastrate: ${buffer.sampleRate} Hz`);
Abtastrate: 48000 Hz (abhängig vom Gerät)

Abschnitt einer Audiodatei nach Sekunden ausschneiden

const ctx = new AudioContext();
const response = await fetch('/audio/podcast.mp3');
const original = await ctx.decodeAudioData(await response.arrayBuffer());

const ausschnitt = (buf, startSek, endSek) => {
  const start = Math.floor(startSek * buf.sampleRate);
  const ende = Math.min(Math.floor(endSek * buf.sampleRate), buf.length);
  const neu = new AudioBuffer({
    numberOfChannels: buf.numberOfChannels,
    length: ende - start,
    sampleRate: buf.sampleRate
  });
  for (let k = 0; k < buf.numberOfChannels; k++) {
    neu.copyToChannel(buf.getChannelData(k).subarray(start, ende), k);
  }
  return neu;
};

const clip = ausschnitt(original, 10, 15);
console.log(clip.duration, clip.sampleRate);
5 48000

// Wichtig · Fallstricke

  • Nur lesbar: Eine Zuweisung an buffer.sampleRate wird stillschweigend ignoriert (im Strict Mode gibt es einen TypeError). Wer eine andere Rate braucht, muss neu abtasten, z. B. mit einem OfflineAudioContext mit der Ziel-Abtastrate.
  • decodeAudioData resampelt: Der dekodierte Puffer hat die Abtastrate des Kontexts, nicht die der Datei. Die Originalrate einer MP3 lässt sich darüber also nicht ermitteln.
  • Erlaubter Bereich: Browser müssen mindestens 8000–96000 Hz unterstützen, viele erlauben 3000–768000 Hz. Werte außerhalb davon führen bei createBuffer() bzw. im Konstruktor zu einem NotSupportedError.
  • Passt die Rate des Puffers nicht zur Rate des AudioContext, resampelt AudioBufferSourceNode automatisch. Das kostet Rechenzeit und kann die Klangqualität leicht verschlechtern.
  • Der Konstruktor new AudioBuffer() ist erst in neueren Browsern vorhanden (Safari ab 14.1). Für ältere Umgebungen verwendet man ctx.createBuffer().