我是 html5 的新手,我想使用 ScriptProcessorNode 来生成声音。我的问题是这段代码在 iPhone Safari 中不起作用。但它适用于桌面上的 Safari。
变量上下文;var isPlaying; 变量生成器节点;var isNeedShowAlert;
function myButtonClick(button)
{
isNeedShowAlert = true;
if (isPlaying)
{
isPlaying = false;
console.log("Stop!");
generatorNode.disconnect();
}
else
{
alert("Play!");
isPlaying = true;
console.log("Play!");
context = new webkitAudioContext();
generatorNode = context.createJavaScriptNode(2048, 1, 2);
generatorNode.onaudioprocess = function (e)
{
console.log("onaudioprocess!");
$("body").append("buffering<br/>");
var output = e.outputBuffer.getChannelData(0);
if (isNeedShowAlert)
{
isNeedShowAlert = false;
console.log("Length "+ output.length);
alert("Length "+ output.length);
}
for (var i = 0; i < output.length; i++)
{
output[i] = Math.random();
}
}
generatorNode.connect(context.destination);
alert("Node Connected");
}
}
看起来 onaudioprocess 从未调用过。在这里人们写道 ScriptProcessorNode 可以被垃圾收集器销毁,但在我的情况下它是全局变量。我尝试了很多并开始思考,这不是在 iPhone Safari 中使用 ScriptProcessorNode 的方法。有人可以做id吗?
UPD。但是如果我使用 AudioBufferSourceNode,它就可以工作。
bufferNode = context.createBufferSource()
var buffer = context.createBuffer(1, 1024, context.sampleRate)
var data = buffer.getChannelData(0);
for (var i = 0; i < 1024; i++)
{
data[i] = Math.random();
}
bufferNode.buffer = buffer;
bufferNode.loop = true;
bufferNode.connect(context.destination);
bufferNode.noteOn(0);
看起来问题出在 ScriptProcessorNode 及其 onaudioprocess 方法中。