2

私はhtml5が初めてで、ScriptProcessorNodeを使用してサウンドを生成したいと考えています。私の問題は、このコードが iPhone サファリで機能しないことです。ただし、デスクトップのサファリでは機能します。

var コンテキスト; 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 が呼び出されていないようです。ここでは、ScriptProcessorNode はガベージ コレクターとして破棄される可能性があると書いていますが、私の場合はグローバル変数です。私はいろいろ試してみて、iPhone Safari で ScriptProcessorNode を使用する方法はないと考え始めました。だれかidできますか?

アップデート。しかし、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 メソッドに問題があるようです。

4

2 に答える 2

0

私は自分で答えを見つけました。ソース ノードを 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 サファリ ブラウザで動作します。

アップデート。ホワイト ノイズ生成コードを更新します。私は私のターゲットではありません。テストに使用するだけですが、誰かが私の間違ったコードを使用して実際のホワイト ノイズを生成した場合、それは悪いことです。

于 2013-06-14T12:03:41.540 に答える