Signatur
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
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`);
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);
// Wichtig · Fallstricke
- Nur lesbar: Eine Zuweisung an
buffer.sampleRatewird stillschweigend ignoriert (im Strict Mode gibt es einenTypeError). Wer eine andere Rate braucht, muss neu abtasten, z. B. mit einemOfflineAudioContextmit 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 einemNotSupportedError. - Passt die Rate des Puffers nicht zur Rate des
AudioContext, resampeltAudioBufferSourceNodeautomatisch. 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 manctx.createBuffer().