Audio ScriptProcessorNode outputBuffer 在 Chrome 中只包含 0

Posted

技术标签:

【中文标题】Audio ScriptProcessorNode outputBuffer 在 Chrome 中只包含 0【英文标题】:Audio ScriptProcessorNode outputBuffer contains only 0 in Chrome 【发布时间】:2017-06-15 12:07:36 【问题描述】:

我正在尝试制作一个音频脚本处理器来处理我的音频,但我无法在 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
    
  

当我在外循环结束设置断点时,可以看到inputData全是数字,而outputData只包含0。我错过了什么吗?

【问题讨论】:

只是出于好奇,可能无济于事,当你记录这些值而不使用断点时你有什么? @Kaiido 有趣,当我记录它们时,值会显示出来。不确定 Chrome 在那里做什么...... 从一些个人测试来看,我认为他们确实在并行线程上运行音频 API。这意味着当中断发生时,脚本处理器中保存的值可能不再存在。但我真的很惊讶 ScriptProcessor 的行为相同。而这一切都只是假设,我从未找到(也没有搜索过)任何可靠的消息来源表明我所说的是真的。 【参考方案1】:

好的,我想我知道发生了什么(也许有人可以验证这一点......)。正如@Kaiido 指出的那样,音频 API 似乎在并行线程上运行,这意味着 outputBuffer 只是在一段时间后从音频线程中拉出,只留下 0。如果我这样做(不漂亮,但符合我的目的):

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

我想我将不得不尝试使用 firefox 或其他工具进行调试。

【讨论】:

以上是关于Audio ScriptProcessorNode outputBuffer 在 Chrome 中只包含 0的主要内容,如果未能解决你的问题,请参考以下文章

ScriptProcessorNode 内部结构

scriptProcessorNode.onaudioprocess 无法访问全局变量

ScriptProcessorNode 已弃用。改用 AudioWorkletNode

JavaScript - WebAudio API ScriptProcessorNode InputBuffer getChannelData 精度

使用 WebAudio 合并/混合两个音频流

audio标签兼容IE11