网络音频:无法让 ScriptProcessor 节点在 Chrome 中工作

Web audio: Can't get ScriptProcessor node to work in Chrome

本文关键字:节点 Chrome 工作 ScriptProcessor 音频 网络      更新时间:2023-09-26

在网络音频中,我无法让 ScriptProcessor 节点在 Chrome 中工作,尽管它在 Firefox 中运行良好。

// Create audio context (Chrome/Firefox)
var context;
if (window.AudioContext) {
    context = new AudioContext(); 
} else {
    context = new webkitAudioContext(); 
}
// Create oscillator and start it
oscillator = context.createOscillator();
oscillator.start(0);
// Set up a script node that sets output to white noise
var myscriptnode = context.createScriptProcessor(4096, 1, 1);
myscriptnode.onaudioprocess = function(event) {
    console.log('Processing buffer');
    var output = event.outputBuffer.getChannelData(0);
    for (i = 0; i < output.length; i++) {
        output[i] = Math.random() / 10;
    }
};
// Connect oscillator to script node and script node to destination
// (should output white noise)
oscillator.connect(myscriptnode);
myscriptnode.connect(context.destination);
// NOTE: This commented-out code connects oscillator directly to
// destination, which works in Chrome as well as Firefox.
//oscillator.connect(context.destination);

此示例的预期结果是它应该以 1/10 的音量播放白噪声(振荡器实际上被忽略)。

您可以在 http://jsfiddle.net/78yKV/3/尝试此代码 - 请注意,在 Firefox 上,此 URL 将立即播放白噪声!在Chrome 30上,它不会给出任何错误,但也不会给出任何音频输出。我也检查了Chrome 31测试版,但看到了相同的结果。"处理缓冲区"日志条目永远不会显示。

要测试常规音频系统,如果您取消注释最后一行并将振荡器直接连接到目标,则振荡器确实会在 Chrome 上正确播放音频(振荡器音)。但是我无法让ScriptProcessor在Chrome上运行。

我在网上搜索了带有ScriptProcessor的教程等,但我发现这些教程要么没有提供可运行的示例,要么不起作用(或太复杂)。

(只是为了澄清 - 这是一个精简的示例,与我实际尝试做的事情没有任何关系,所以请不要告诉我我不应该使用 ScriptProcessor 来生成白噪声。这不是它的用途;我绝对需要脚本处理器来为我的实际用途工作。

我认为我很可能正在做一些非常愚蠢的事情,比如我有错误的事件名称或类似的东西,但我找不到它。谁能帮忙?

我现在

设法检查了其他几台机器,我认为问题特定于我机器上的默认音频设备,这是使用Microsoft默认USB音频驱动程序的电话听筒。我已经使用 Chrome 中的菜单选项向谷歌报告了这个问题;我的猜测是,出现问题是因为手机仅支持单声道16 kHz输出,不知何故,这会导致Chrome感到困惑。

我可以在具有相同手机品牌的同事机器上重现该错误。重申:

  • 使用手机时,Firefox 在两台机器上都能正常工作。
  • 当您选择不同的输出设备时,两台计算机在 Chrome 中都能正常工作。
  • 即使在
  • 使用电话听筒时,振荡器播放也能在 Chrome 中正常工作。

测试代码 http://jsfiddle.net/78yKV/7/的最终版本

function doStuff(osc) {
  // Create audio context (Chrome/Firefox)
  var context;
  if (window.AudioContext) {
    context = new AudioContext(); 
  } else {
    context = new webkitAudioContext(); 
  }
  // Set up a script node that sets output to white noise
  var myscriptnode;
  if (context.createScriptProcessor) {
    myscriptnode = context.createScriptProcessor(4096, 1, 1);
  } else {
    myscriptnode = context.createJavaScriptNode(4096, 1, 1);
  }
  var buffer = 1;
  myscriptnode.onaudioprocess = function(event) {
    console.log('Processing buffer ' + (buffer++));
    var output = event.outputBuffer.getChannelData(0);
    for (i = 0; i < output.length; i++) {
      output[i] = Math.random() / 10;
    }
  };
  // Connect script node to destination
  if (osc) {
    oscillator = context.createOscillator();
    oscillator.start(0);
    oscillator.connect(context.destination);
  } else {
    myscriptnode.connect(context.destination);
  }
}

这个脚本的白噪声播放(实际上是一个稍早的测试版本,但我认为它是相同的)在Windows 7,Windows 8.1,Linux和Android 4.1上的Chrome 30中工作;在Windows上的Firefox上;在iPad上(最新的操作系统)上;以及使用Safari 6.0.5的Mac上(如果你在那里打开开发人员工具,它会中断, 但只要你不这样做,它就会起作用)。它仅在使用上述 USB 电话听筒 (Polycom CX300) 时失败。

因此,换句话说,正如apsillers所建议的那样,这看起来仍然像一个Chrome错误,但是一个相当具体的错误。(顺便说一下,我也尝试了最新的"金丝雀"版本的Chrome,但它没有帮助。