Signatur
Beschreibung
Die schreibgeschützte Eigenschaft length gibt an, wie viele Sample-Frames der OfflineAudioContext beim Rendern erzeugt. Der Wert entspricht genau dem Argument length, das beim Konstruktor angegeben wurde. Er gilt pro Kanal, zählt also Frames und nicht einzelne Samples über alle Kanäle hinweg.
Die Dauer in Sekunden erhalten Sie mit length / sampleRate. Mit der Eigenschaft können Sie z. B. einen Fortschrittsbalken berechnen (currentTime * sampleRate / length), Zeitpunkte für suspend() festlegen oder prüfen, ob ein geplanter Ton überhaupt noch in den Render-Zeitraum fällt.
Der AudioBuffer, den startRendering() liefert, hat dieselbe length wie der Kontext. Sie ist auch dann schon verfügbar, wenn das Rendern noch gar nicht begonnen hat.
Rückgabewert
unsigned long): Anzahl der Sample-Frames im Render-Puffer.Beispiele
Länge und Dauer auslesen
const ctx = new OfflineAudioContext({
numberOfChannels: 2,
length: 44100 * 3, // 3 Sekunden
sampleRate: 44100,
});
console.log(ctx.length);
console.log(`${ctx.length / ctx.sampleRate} s`);
Ton rendern und Pufferlänge vergleichen
const renderTone = async () => {
const ctx = new OfflineAudioContext(1, 48000, 48000);
const osc = new OscillatorNode(ctx, { frequency: 440 });
osc.connect(ctx.destination);
osc.start();
osc.stop(ctx.length / ctx.sampleRate);
const buffer = await ctx.startRendering();
console.log(buffer.length === ctx.length, buffer.duration);
};
renderTone();
Fortschritt beim Rendern mit suspend() anzeigen
const renderWithProgress = async () => {
const ctx = new OfflineAudioContext(2, 44100 * 10, 44100);
const osc = new OscillatorNode(ctx);
osc.connect(ctx.destination);
osc.start();
const totalSeconds = ctx.length / ctx.sampleRate;
for (let t = 2; t < totalSeconds; t += 2) {
ctx.suspend(t).then(() => {
const percent = Math.round((ctx.currentTime * ctx.sampleRate / ctx.length) * 100);
console.log(`Fortschritt: ${percent} %`);
ctx.resume();
});
}
await ctx.startRendering();
console.log('Fertig');
};
renderWithProgress();
// Wichtig · Fallstricke
- Schreibgeschützt: Zuweisungen wie
ctx.length = 1000werden ignoriert (im Strict Mode gibt es einenTypeError). Die Länge lässt sich nach dem Erzeugen nicht mehr ändern. Für eine andere Länge brauchen Sie einen neuen Kontext. - Frames statt Bytes: Der Speicherbedarf beträgt ungefähr
length × numberOfChannels × 4Byte (Float32). Sehr lange Puffer können viel Arbeitsspeicher belegen. - Wenn im Konstruktor
length0 ist, wirft er einenNotSupportedError. Mit der Kurzformnew OfflineAudioContext(channels, length, sampleRate)kommen auch ältere Browser zurecht. - Kompatibilität: Safari hat die Eigenschaft erst ab Version 14.1 unterstützt, ältere WebKit-Versionen nur mit Präfix (
webkitOfflineAudioContext). Falls sie fehlt, können Sie die Länge überrenderedBuffer.lengthermitteln.