如何在AudioWorkletProcessor内部访问AudioContext?
解决AudioWorkletProcessor中获取createBuffer的问题
核心思路
AudioWorklet内部无法直接访问主上下文的createBuffer,但可以通过传递采样率+使用OfflineAudioContext来实现需求,避免Float32Array缺少采样率导致的音高错误。
具体步骤
将主上下文的采样率传入Worklet
在实例化AudioWorklet时,通过processorOptions把主AudioContext的采样率传递进去:new AudioWorklet(audioContext, 'worklet-name', { processorOptions: { sampleRate: audioContext.sampleRate } });在AudioWorkletProcessor的构造函数中读取该采样率:
class MyWorkletProcessor extends AudioWorkletProcessor { constructor(options) { super(options); // 保存采样率供后续使用 this.sampleRate = options.processorOptions.sampleRate; } // ... 其他逻辑 }在Worklet内部用OfflineAudioContext创建AudioBuffer
AudioWorkletGlobalScope允许使用OfflineAudioContext,它提供了createBuffer方法,用传入的采样率初始化即可:// 在Worklet内部的处理逻辑中 const offlineCtx = new OfflineAudioContext(1, 1, this.sampleRate); // 创建指定通道数、帧数、采样率的AudioBuffer const audioBuffer = offlineCtx.createBuffer(2, 44100, this.sampleRate);这样创建的AudioBuffer采样率和主上下文一致,不会出现音高偏差。
关键说明
- 无需传递整个AudioContext,仅传递采样率即可,减少数据开销
- OfflineAudioContext是Worklet环境中合法可用的API,专门用于离线音频处理操作
内容的提问来源于stack exchange,提问作者kr094
相关产品推荐
相关产品推荐

