在网络音频中,我无法让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上,此网址会立即播放白噪声!在Chrome 30上,它不会出现任何错误,但也不会提供任何音频输出。我还检查了Chrome 31测试版,但看到了相同的结果。 “处理缓冲区”日志条目永远不会出现。
要测试一般音频系统,如果取消注释最后一行并将振荡器直接连接到目的地,它会在Chrome上正确播放音频(振荡器音调)。但我无法让ScriptProcessor在Chrome上运行。
我使用ScriptProcessor在网上搜索教程等,但我发现那些没有带有可运行的例子或者没有工作(或者太复杂)。
(只是为了说清楚 - 这是一个精简的样本,并没有以任何方式与我实际上要做的事情有关,所以请不要告诉我我不应该使用ScriptProcessor来产生白噪声。这不是它的用途;我确实需要ScriptProcessor来实现我的实际用途。)
我认为我很可能正在做一些非常愚蠢的事情,比如我有错误的事件名称或类似的东西,但我找不到它。有人可以帮忙吗?
答案 0 :(得分:1)
我现在设法检查了其他几台机器,我认为问题是我机器上的默认音频设备所特有的,这是一部使用Microsoft默认USB音频驱动程序的电话听筒。我已经使用Chrome中的菜单选项向Google报告了此情况;我的猜测是问题出现是因为手机只支持单声道16 kHz输出,不知怎的,这会导致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 bug,但却是一个相当特殊的bug。 (顺便说一下,我也尝试了最新的'Canary'版本的Chrome,但它并没有帮助。)