2

これは、Web オーディオを使用してライブ入力のラウドネスを測定する単純な jsFiddle へのリンクです (値をパーセンテージでコンソールに出力します)。

http://jsfiddle.net/XSnsF/

カスタムノードがボリュームの計算を完了するのを待ってオーディオ信号を遅らせる必要がないため、入力を 1 つにして出力を持たないことを計画していました。

ただし、scriptProcessor が に接続されている場合にのみ値をログに記録することが明らかになりましたcontext.destination。私は何か間違ったことをしていますか?それともこれはバグですか?それとも、これは予想される動作ですか?

function gotStream(stream) {

    var mediaStreamSource = context.createMediaStreamSource(stream);

    var gainNode = context.createGain();
    gainNode.gain.value = 3;

    var levelChecker = context.createScriptProcessor(2048);

    mediaStreamSource.connect(gainNode);
    gainNode.connect(levelChecker);

    //Commenting out the line directly below stops the script processor from working!
    levelChecker.connect(context.destination);
    levelChecker.onaudioprocess = process;

}

function process(e) {
    var buffer = e.inputBuffer.getChannelData(0);

    var maxVal = 0;

    for (var i = 0; i < buffer.length; i++) {

        if (maxVal < buffer[i]) {
            maxVal = buffer[i];
        }
    }

    console.log(Math.round(maxVal * 100) + "%");
}
4

1 に答える 1

5

これは、Blink & Webkit 実装のバグです。仕様によると、「audioprocess イベントは、ScriptProcessorNode に少なくとも 1 つの入力または 1 つの出力が接続されている場合にのみディスパッチされます。」両方は必要ありません。

とりあえず、audiocontext.destination に接続されたゼロゲイン GainNode に接続します。

于 2013-10-20T21:25:55.750 に答える