Javascript 在iPhone Safari中使用ScriptProcessorNode
我是html5新手,我想使用ScriptProcessorNode来生成声音。我的问题是,这段代码在iPhone safari中不起作用。但它在桌面上的safari中工作 var语境; var显示; 无功发生器节点; var需要显示警报Javascript 在iPhone Safari中使用ScriptProcessorNode,javascript,ios,html,safari,web-audio-api,Javascript,Ios,Html,Safari,Web Audio Api,我是html5新手,我想使用ScriptProcessorNode来生成声音。我的问题是,这段代码在iPhone safari中不起作用。但它在桌面上的safari中工作 var语境; var显示; 无功发生器节点; var需要显示警报 function myButtonClick(button) { isNeedShowAlert = true; if (isPlaying) {
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可以被垃圾收集器销毁,但在我的例子中,它是全局变量。我尝试了很多,并开始思考,trere并不是在iPhone Safari中使用ScriptProcessorNode的方法。有人能帮我查一下身份证吗
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方法中。我自己找到了答案。需要将源节点添加到ScriptProcessorNode。像这样的
bufferNode = context.createBufferSource()
var buffer = context.createBuffer(1, 1024, context.sampleRate)
var data = buffer.getChannelData(0);
for (var i = 0; i < 2048; i++)
{
data[i] = 0;
}
bufferNode.buffer = buffer;
bufferNode.loop = true;
generatorNode = context.createJavaScriptNode(2048, 1, 1);
generatorNode.channelCount = 2;
generatorNode.channelCountMode = "max";
generatorNode.channelInterpretation = "speakers";
generatorNode.onaudioprocess = function generateWhiteNoise(e)
{
var output = e.outputBuffer.getChannelData(0);
console.log("onaudioprocess!");
for (var i = 0; i < output.length; i++)
{
output[i] = ( Math.random() * 2 ) - 1;
}
}
bufferNode.connect(generatorNode);
generatorNode.connect(context.destination);
bufferNode.noteOn(0);
此代码将在iOS safari浏览器中运行
UPD。更新白噪声生成代码。我不是我的目标,只是将其用于测试,但如果有人使用我的错误代码来产生真正的白噪声,这将是不好的。在遇到同样的问题后,我在这里尝试了公认的答案,但它对我不起作用。问题似乎在于,当generatorNode连接到context.destination context.state时,它仍然处于挂起状态!在同一块中添加context.resume没有效果。添加由按钮单击事件触发的context.resume会起作用,同时也会触发先前的恢复!对于我来说,这仍然是一个太多的解决方案,但它是一个有效的解决方案 如果有人对触发context.resume的更好解决方法有任何建议/想法,或者像其他浏览器一样完全不需要它,我们将不胜感激
仅供参考,如果你真的想产生白噪声,你需要输出[i]=Math.random*2-1@凯维尼尼斯,谢谢你。我不需要白噪声,只是用它来测试。
var suspendBtn = document.getElementById("suspendBtn");
var resumeBtn = document.getElementById("resumeBtn");
suspendBtn.onclick = function() {
context.suspend();
}
resumeBtn.onclick = function() {
context.resume();
}
var context = new webkitAudioContext();
var generatorNode = context.createJavaScriptNode(2048, 1, 2);
generatorNode.onaudioprocess = function generateWhiteNoise(e) {
var output = e.outputBuffer.getChannelData(0);
for (var i = 0; i < output.length; i++) {
output[i] = ( Math.random() * 2 ) - 1;
}
}
// This connects the generatorNode but in a suspended state!
generatorNode.connect(context.destination);
// This has no effect!
// seems that it needs to be called from another context/closure
context.resume();