【问题标题】:Chrome: onaudioprocess stops getting called after a whileChrome:onaudioprocess 在一段时间后停止被调用
【发布时间】:2014-06-21 04:01:34
【问题描述】:

我正在使用 ScriptProcessorNode 的 onaudioprocess 回调来处理麦克风输入。 通过将 MediaStreamSourceNode 连接到 ScriptProcessorNode,我可以在 onaudioprocess 回调函数中获取原始音频数据。 然而,大约 30 秒后(从 10 到 35 秒不等),浏览器停止调用 onaudioprocess。 在以下代码中,console.log 输出('>>')总是在大约 30 秒后停止。

var ctx = new AudioContext();
var BUFFER_LENGTH = 4096;
console.log('Buffer length is + ' + BUFFER_LENGTH);
navigator.webkitGetUserMedia({audio: true}, function (stream) {
    var mediaStreamSource = ctx.createMediaStreamSource(stream);
    var scriptProcessor = ctx.createScriptProcessor(BUFFER_LENGTH, 1, 1);
    scriptProcessor.onaudioprocess = function (e) {
      console.log('>>');
    };
    scriptProcessor.connect(ctx.destination);
}, function(e) {
  console.error('Unable to get audio input source.');
});

我尝试了所有可能的 BUFFER_LENGTH(256、512、1024、2048、4096、8192、16384),但情况没有改变(日志在 30 秒后停止。) 我在最新的 Chrome 版本(版本 35.0.1916.153)和 Canary(版本 37.0.2060.3 canary)中观察到了这个问题。 有谁知道任何解决方法?

【问题讨论】:

  • 我想知道这是否与您在 onaudioprocess 回调中返回空 e.outputbuffers 的事实有关。在看到空缓冲区 30 秒后,Chrome 可能想要节省电池/处理能力并关闭回调。
  • 感谢notthetup,我尝试将inputBuffer复制到onaudioprocess中的outputBuffer。但它并没有解决问题。代码如下: var source = e.inputBuffer.getChannelData(0); var dest = e.outputBuffer.getChannelData(0); dest.set(source);

标签: google-chrome web-audio-api getusermedia


【解决方案1】:

这看起来更像是您的脚本处理器对象正在被垃圾收集。尝试将其保存在全局变量中,看看是否能解决问题。

【讨论】:

  • 谢谢你,克里斯。正如您所说,将 ScriptProcessorNode 保存在全局变量中解决了这个问题。但我认为这种行为(垃圾收集仍然连接的节点)需要修复。这是否已作为错误提交?
  • 如果我没记错的话,AudioContext 目标不维护对 ScriptProcessor 的引用。所以 ScriptProcessor 的垃圾回收在这里实际上是合适的,因为没有任何东西可以引用它。
  • 我发现了一个似乎与此问题有关的开放错误:bugs.webkit.org/show_bug.cgi?id=112521 看起来像是去年建议的补丁,但尚未被接受。
  • 规范声明:“任何在一个循环中连接并且直接或间接连接到 AudioContext 的 AudioDestinationNode 的 AudioNode 将保持活动,只要 AudioContext 还活着。” w3.org/TR/webaudio/#lifetime-AudioNode
  • 我发现了这个 chrome 错误(仍然未分类):code.google.com/p/chromium/issues/detail?id=360378
猜你喜欢
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2015-07-05
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多