Javascript 音频ScriptProcessorNode outputBuffer在Chrome中仅包含0

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

我正在尝试制作一个音频脚本处理器,它可以处理我的音频,但我无法在Chrome中调试它。在firefox上运行良好,但在chrome上,我的声音效果很好(很多时候,我的声卡基本上一直显示满功率,尽管我的音量降低了40%)。我的主要问题是我无法在chrome中调试它,因为我的outputBuffer只包含0,即使在我复制了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