网络音频:无法让 ScriptProcessor 节点在 Chrome 中工作
Web audio: Can't get ScriptProcessor node to work in Chrome
在网络音频中,我无法让 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,但它没有帮助。
- 节点检查器无法打开chrome浏览器,引发错误ENOENT
- 节点网络套接字:1006远程对等方在谷歌Chrome上丢弃的连接
- 网络音频:无法让 ScriptProcessor 节点在 Chrome 中工作
- 节点检查器/Chrome 实例不显示源文件、调用堆栈、任何内容
- 在 Chrome 中使用 JavaScript Rangy 在空节点之前插入节点
- 观察通过 chrome devtools 添加/删除节点时的 DOM 突变
- Chrome扩展程序替换文本DOM节点.不
- 使用 jQuery 从 Chrome 中的 XML 节点获取内部 XML
- 使用Chrome中的JavaScript节点命令行工具
- 在Chrome中选择文本节点的开始
- 如何获取chrome书签树的所有结束节点
- Chrome execCommand'insertHTML'当插入符号在节点内部时,在节点外部插入跨度
- Chrome浏览器事件循环与节点事件循环之间是否存在显著差异
- 使用节点webkit下载文件时出错(URL中的“chrome扩展名”)
- 如何在Chrome扩展内容脚本中获得D3节点的数据
- 通过chrome.tabs.sendMessage发送DOM节点对象
- 为什么节点不评估Math.tan(Math.PI/2)到无穷大,但Chrome V8确实如此
- 使用angular-cli在Chrome上运行一个本地构建的angular 2应用,不需要节点服务器
- chrome中节点的getComputedStyle为空
- 范围对象,获取选择父节点Chrome vs Firefox