AudioContext gain 节点不静音音源(Web Audio API)
AudioContext gain Node does not mute audio source (Web Audio API)
我有一些使用 three.js 和网络音频 API 制作的音乐可视化,但我在静音音频时遇到了问题。
我目前有一个带有分析器和源缓冲区的 AudioContext 对象。我正在努力添加一个增益节点来使音频静音,但目前无法正常工作。当我点击静音时,音频电平会发生变化(实际上会变大),所以我知道增益会影响某些东西。
代码:
// AudioHelper class constructor
function AudioHelper() {
this.javascriptNode;
this.audioContext;
this.sourceBuffer;
this.analyser;
this.gainNode;
this.isMuted;
}
// Initialize context, analyzer etc
AudioHelper.prototype.setupAudioProcessing = function () {
// Get audio context
this.audioContext = new AudioContext();
this.isMuted = false;
// Create JS node
this.javascriptNode = this.audioContext.createScriptProcessor(2048, 1, 1);
this.javascriptNode.connect(this.audioContext.destination);
// Create Source buffer
this.sourceBuffer = this.audioContext.createBufferSource();
// Create analyser node
this.analyser = this.audioContext.createAnalyser();
this.analyser.smoothingTimeConstant = 0.3;
this.analyser.fftSize = 512;
this.gainNode = this.audioContext.createGain();
this.sourceBuffer.connect(this.analyser);
this.analyser.connect(this.javascriptNode);
this.sourceBuffer.connect(this.audioContext.destination);
this.sourceBuffer.connect(this.gainNode);
this.gainNode.connect(this.audioContext.destination);
this.gainNode.gain.value = 0;
};
// This starts my audio processing (all this and the analyzer works)
AudioHelper.prototype.start = function (buffer) {
this.audioContext.decodeAudioData(buffer, decodeAudioDataSuccess, decodeAudioDataFailed);
var that = this;
function decodeAudioDataSuccess(decodedBuffer) {
that.sourceBuffer.buffer = decodedBuffer
that.sourceBuffer.start(0);
}
function decodeAudioDataFailed() {
debugger
}
};
// Muting function (what isn't working)
AudioHelper.prototype.toggleSound = function() {
if(!this.isMuted) {
this.gainNode.gain.value = 0;
} else {
this.gainNode.gain.value = 1;
}
this.isMuted = !this.isMuted;
}
关于我是否错误地设置了增益节点,有什么想法吗?有没有更好的静音方法?
谢谢!
问题是您仍然将缓冲源直接连接到目标并通过增益节点连接它 - 因此您实际上已经从源缓冲区到目标有两根跳线(一根通过增益节点) .您应该删除以下行:
this.sourceBuffer.connect(this.audioContext.destination);
以及这一行(因为你希望它开始时不静音):
this.gainNode.gain.value = 0;
而且我认为您会得到预期的行为。
我遇到了同样的问题,我解决了将 0 增益值作为字符串传递的问题,例如
this.gainNode.gain.value = "0";
这真的很奇怪,我不知道为什么会这样。
除了 cwilso 的回答之外的所有内容
我有一些使用 three.js 和网络音频 API 制作的音乐可视化,但我在静音音频时遇到了问题。
我目前有一个带有分析器和源缓冲区的 AudioContext 对象。我正在努力添加一个增益节点来使音频静音,但目前无法正常工作。当我点击静音时,音频电平会发生变化(实际上会变大),所以我知道增益会影响某些东西。
代码:
// AudioHelper class constructor
function AudioHelper() {
this.javascriptNode;
this.audioContext;
this.sourceBuffer;
this.analyser;
this.gainNode;
this.isMuted;
}
// Initialize context, analyzer etc
AudioHelper.prototype.setupAudioProcessing = function () {
// Get audio context
this.audioContext = new AudioContext();
this.isMuted = false;
// Create JS node
this.javascriptNode = this.audioContext.createScriptProcessor(2048, 1, 1);
this.javascriptNode.connect(this.audioContext.destination);
// Create Source buffer
this.sourceBuffer = this.audioContext.createBufferSource();
// Create analyser node
this.analyser = this.audioContext.createAnalyser();
this.analyser.smoothingTimeConstant = 0.3;
this.analyser.fftSize = 512;
this.gainNode = this.audioContext.createGain();
this.sourceBuffer.connect(this.analyser);
this.analyser.connect(this.javascriptNode);
this.sourceBuffer.connect(this.audioContext.destination);
this.sourceBuffer.connect(this.gainNode);
this.gainNode.connect(this.audioContext.destination);
this.gainNode.gain.value = 0;
};
// This starts my audio processing (all this and the analyzer works)
AudioHelper.prototype.start = function (buffer) {
this.audioContext.decodeAudioData(buffer, decodeAudioDataSuccess, decodeAudioDataFailed);
var that = this;
function decodeAudioDataSuccess(decodedBuffer) {
that.sourceBuffer.buffer = decodedBuffer
that.sourceBuffer.start(0);
}
function decodeAudioDataFailed() {
debugger
}
};
// Muting function (what isn't working)
AudioHelper.prototype.toggleSound = function() {
if(!this.isMuted) {
this.gainNode.gain.value = 0;
} else {
this.gainNode.gain.value = 1;
}
this.isMuted = !this.isMuted;
}
关于我是否错误地设置了增益节点,有什么想法吗?有没有更好的静音方法?
谢谢!
问题是您仍然将缓冲源直接连接到目标并通过增益节点连接它 - 因此您实际上已经从源缓冲区到目标有两根跳线(一根通过增益节点) .您应该删除以下行:
this.sourceBuffer.connect(this.audioContext.destination);
以及这一行(因为你希望它开始时不静音):
this.gainNode.gain.value = 0;
而且我认为您会得到预期的行为。
我遇到了同样的问题,我解决了将 0 增益值作为字符串传递的问题,例如
this.gainNode.gain.value = "0";
这真的很奇怪,我不知道为什么会这样。
除了 cwilso 的回答之外的所有内容