Javascript 音频ScriptProcessorNode outputBuffer在Chrome中仅包含0
我正在尝试制作一个音频脚本处理器,它可以处理我的音频,但我无法在Chrome中调试它。在firefox上运行良好,但在chrome上,我的声音效果很好(很多时候,我的声卡基本上一直显示满功率,尽管我的音量降低了40%)。我的主要问题是我无法在chrome中调试它,因为我的outputBuffer只包含0,即使在我复制了inputBuffer之后也是如此。但出于某种原因,仍然有声音。我的代码的重要部分是:Javascript 音频ScriptProcessorNode outputBuffer在Chrome中仅包含0,javascript,google-chrome,debugging,audio,html5-audio,Javascript,Google Chrome,Debugging,Audio,Html5 Audio,我正在尝试制作一个音频脚本处理器,它可以处理我的音频,但我无法在Chrome中调试它。在firefox上运行良好,但在chrome上,我的声音效果很好(很多时候,我的声卡基本上一直显示满功率,尽管我的音量降低了40%)。我的主要问题是我无法在chrome中调试它,因为我的outputBuffer只包含0,即使在我复制了inputBuffer之后也是如此。但出于某种原因,仍然有声音。我的代码的重要部分是: function processAudio(evt) { var inputBuffer
function processAudio(evt) {
var inputBuffer = evt.inputBuffer;
var outputBuffer = evt.outputBuffer;
for (var channel = 0; channel < 2; channel++) {
var inputData = inputBuffer.getChannelData(channel);
var outputData = outputBuffer.getChannelData(channel);
for (var i = 0; i < inputBuffer.length; i++) {
outputData[i] = inputData[i];
// At this point outputData[i] = 0, but inputData[i] is not 0
// The audio plays normally, so there obviously is something in the outputBuffer
}
}
}
功能处理音频(evt){
var inputBuffer=evt.inputBuffer;
var outputBuffer=evt.outputBuffer;
用于(var通道=0;通道<2;通道++){
var inputData=inputBuffer.getChannelData(通道);
var outputData=outputBuffer.getChannelData(通道);
对于(变量i=0;i
当我在外循环的末尾设置断点时,我可以看到inputData充满了数字,但outputData只包含0。我遗漏了什么吗?好的,我想我知道发生了什么事(也许有人能证实这一点…)。正如@kaido所指出的,音频API似乎运行在一个并行线程上,这意味着outputBuffer在一段时间后从音频线程中取出,只剩下0。如果我这样做(不漂亮,但符合我的目的):
我想我必须尝试使用firefox或其他工具进行调试。只是出于好奇,可能没有帮助,当你记录这些值时,没有使用断点,你有什么用?@kaido有趣的是,当我记录这些值时,这些值会显示出来。不确定Chrome在那里做什么…从一些个人测试来看,我认为他们确实在并行线程上运行音频API。这意味着当中断发生时,脚本处理器中保存的值可能不再存在。但我真的很惊讶ScriptProcessor的行为是一样的。所有这些都只是假设,我从来没有找到(也没有搜索)任何可靠的消息来源来说明我所说的是真的。
function processAudio(audioProcessingEvent) {
var inputBuffer = audioProcessingEvent.inputBuffer;
var outputBuffer = audioProcessingEvent.outputBuffer;
var inputData = inputBuffer.getChannelData(channel);
var outputData = outputBuffer.getChannelData(channel);
for (var sample = 0; sample < outputBuffer.length; sample++) {
outputData[sample] = ((Math.random() * 2) - 1) * 0.2;
}
console.log("first = " + outputData[0]);
// Delay 200ms until the outputBuffer gets pulled
var date = new Date();
var curDate = null;
do { curDate = new Date(); }
while(curDate-date < 200);
console.log("first_delay = " + outputData[0]);
}
first = 0.060469988733530045
first_delay = 0
first = -0.026373833417892456
first_delay = 0
first = -0.037974122911691666
first_delay = 0