我是html5的新手,我想使用ScriptProcessorNode生成声音。我的问题是此代码在iPhone Safari中不起作用。但是它可以在桌面上的野生动物园中使用。

var context;
            var isPlaying;
            var generatorNode;
            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。 here人们写道,可以将ScriptProcessorNode销毁为垃圾回收器,但在我的情况下,它是全局变量。我尝试了很多,开始思考,这种烦恼无法在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。更新白噪声生成代码。我不是我的目标,只是将其用于测试,但是如果有人使用我的错误代码生成真正的白噪声,那将是不好的。

07-24 09:30