【问题标题】:Web audio: Can't get ScriptProcessor node to work in Chrome网络音频:无法让 ScriptProcessor 节点在 Chrome 中工作
【发布时间】:2013-11-16 11:21:55
【问题描述】:

在网络音频中,我无法让 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 来产生白噪声。这不是它的用途;我确实需要 ScriptProcessor 来为我的实际使用工作。)

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

【问题讨论】:

  • 起初,我在 Chrome 30 中没有得到任何东西。当我取消注释你的最后一行 保留其他行时,我得到了一个音调加上静态。然后,我重新注释了最后一行,结果只是静态的(即,它工作得很好)。
  • 感谢您查看!我无法重现这种行为(即,如果我取消注释最后一行,我只会听到语气,这可能是正确的;如果我推荐它,我什么也得不到)......我应该说我正在使用 Chrome Windows 7,我怀疑这里可能存在操作系统差异。
  • 您的代码在 Chrome 中适用于我(但一开始并没有)所以我认为可以肯定地说您的代码编写正确并且 Chrome 中存在错误。我怀疑您的代码中存在竞争条件,但您没有使用任何异步行为(除了 onaudioprocess,而且在我看来设置正确)。
  • 谢谢,这绝对是可能的。顺便说一句,我实际上正在研究的是一个原型,以便调查在实际项目中使用它是否现实,所以“不,还没有”很可能是答案!
  • 有关信息,我在 Mac 上的 Safari 中对此进行了测试。为此,我必须更改几个函数名称细节。在那个系统上它有点工作 - 它至少运行了几次事件(我放了一个计数器,看起来它运行了 4 次然后没有错误地死掉)并发出一点嘶嘶声。所以那里也不是一个辉煌的成功。

标签: javascript html google-chrome audio html5-audio


【解决方案1】:

我现在设法检查了其他几台机器,我认为问题出在我机器上的默认音频设备上,它是使用 Microsoft 默认 USB 音频驱动程序的电话听筒。我已使用 Chrome 中的菜单选项将此情况报告给 Google;我的猜测是这个问题的出现是因为手机只支持单声道 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,但没有帮助。)

【讨论】:

    猜你喜欢
    • 2016-07-16
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    相关资源
    最近更新 更多