javascript - AudioWorklet 和 GainNode 控制音量
问题描述
我正在尝试使用 AudioWorklet 和 GainNode 进行音量控制,但它不起作用,没有 AudioWorket 它运行良好。
这是实现
this.audioContext = new AudioContext({
latencyHint: 'interactive',
sampleRate: this.sampleRate,
sinkId: audioinput || "default"
});
this.audioContext.onstatechange = () => {
if (this.audioContext) {
this.state = this.audioContext.state;
} else {
this.state = AudioState.CLOSED;
}
};
this.audioBuffer = this.audioContext.createBuffer(1, this.audioSize, this.sampleRate);
this.audioSource = this.audioContext.createBufferSource();
this.audioSource.buffer = this.audioBuffer;
this.audioGain = this.audioContext.createGain();
this.audioSource.connect(this.audioGain);
this.audioSource.loop = true;
this.audioContext.audioWorklet
.addModule('workers/speaker-worklet-processor.js')
.then(() => {
this.speakerWorklet = new AudioWorkletNode(
this.audioContext,
'speaker-worklet-processor',
{
channelCount: 1,
processorOptions: {
bufferSize: 160,
channelCount: 1,
},
},
);
this.audioGain.connect(this.speakerWorklet).connect(this.audioContext.destination);
}).catch((err)=>{
console.log("Receiver ", err);
});
这是我设置新音量的方式。
public changeVolume(value: number): void {
const volume = Number(value) / 100;
if (this.state !== AudioState.CLOSED) {
this.audioGain.gain.value = volume;
}
}
解决方案
我找到了解决方案,我刚刚添加了
this.audioGain.connect(this.audioContext.destination);
并直接与worklet节点连接
this.speakerWorklet.connect(this.audioGain);
这是完整的代码
this.audioContext = new AudioContext({
latencyHint: 'interactive',
sampleRate: this.sampleRate,
sinkId: audioinput || "default"
});
this.audioContext.onstatechange = () => {
if (this.audioContext) {
this.state = this.audioContext.state;
} else {
this.state = AudioState.CLOSED;
}
};
this.audioBuffer = this.audioContext.createBuffer(1, this.audioSize, this.sampleRate);
this.audioSource = this.audioContext.createBufferSource();
this.audioSource.buffer = this.audioBuffer;
this.audioGain = this.audioContext.createGain();
this.audioGain.gain.minVal = 0.0;
this.audioGain.gain.maxVal = 1.0;
this.audioSource.connect(this.audioGain);
this.audioSource.loop = true;
this.audioGain.connect(this.audioContext.destination);
this.audioContext.audioWorklet
.addModule('workers/speaker-worklet-processor.js')
.then(() => {
this.speakerWorklet = new AudioWorkletNode(
this.audioContext,
'speaker-worklet-processor',
{
channelCount: 1,
processorOptions: {
bufferSize: 160,
channelCount: 1,
},
},
);
this.speakerWorklet.connect(this.audioGain);
}).catch((err)=>{
console.log("Receiver ", err);
});
推荐阅读
- powershell - 获取 powershell 脚本的位置,可选择通过符号链接
- python - 如何使这个numpy数组的初始化工作?
- regex - 如何在正则表达式中至少一次从集合中无序选择每个元素?
- r - R:ggplot - 根据组绘制具有不同颜色的数据点的趋势线
- c# - ASP.NET Core AuthorizationHandler 未被调用
- python - AWS lambda 调用时不运行代码
- javascript - 未更新使用 JavaScript 的密码确认
- docker - Gitlab 使用 helm 安装分蘖导致 kubernetes-charts.storage.googleapis.com 不是有效的图表存储库
- javascript - displayChoice() 和使用 .innerHTML 有什么区别?
- c# - 如何将对象列表投影到嵌套对象列表中