2

ローカル mp3 をストリーミングし、ゲイン コントロールと 3 バンド イコライザーを備えた単純な Web オーディオ API スクリプトを作成しました。

ノードは、ソースがゲイン ノードに接続され、次にローパス、バンドパス、およびハイパス ノードにスリットされるように設定されます。これらの各ノードは、宛先に接続される前にゲインに接続されます。シンプルなEQです。(以下の図とコード)

これは、i7 と 16GB RAM を搭載した Windows 8 Deskop では正常に動作しますが、Celeron プロセッサと 2GB RAM を搭載した Acer C7 Chromebook でこれを実行しようとすると、音声が文字化けします。分割された各パスが同期していないように聞こえます。テンポも上がったように聞こえます。下のYouTubeビデオでこれを見たり聞いたりすることができます。

http://youtu.be/mB3gdjUwQfw

Celeron プロセッサは、3 バンド EQ を簡単に処理できるはずです。これを防ぐためにできることはありますか?ローエンドのハードウェアで同様の問題を経験した人はいますか?

いつもご回答ありがとうございます。素晴らしいままでいてください。

注:オーディオ ソースを分割しない場合、オーディオは正常に再生されます。


シンプルオーディオマップ

function setupChain(outNode) {
        soundSource = context.createBufferSource();
        soundSource.buffer = audioBuffer;

        volumeNode = context.createGainNode();
        volumeNode.gain.value = gainValue;

        highPassFilter = context.createBiquadFilter();
        highPassFilter.type = 1;
        highPassFilter.frequency.value = 4000;
        highPassGain = context.createGainNode();
        highPassGain.gain.value = highValue;

        medPassFilter = context.createBiquadFilter();
        medPassFilter.type = 2;
        medPassFilter.frequency.value = 2125;
        medPassFilter.Q = 1.1333333333333333;
        medPassGain = context.createGainNode();
        medPassGain.gain.value = medValue;

        lowPassFilter = context.createBiquadFilter();
        lowPassFilter.type = 0;
        lowPassFilter.frequency.value = 250;
        lowPassGain = context.createGainNode();
        lowPassGain.gain.value = lowValue;

        // Wiring
        volumeNode.connect(lowPassFilter);
        lowPassFilter.connect(lowPassGain);
        lowPassGain.connect(outNode);

        volumeNode.connect(medPassFilter);
        medPassFilter.connect(medPassGain);
        medPassGain.connect(outNode);

        volumeNode.connect(highPassFilter);
        highPassFilter.connect(highPassGain);
        highPassGain.connect(outNode);

        return volumeNode;
    }

function stopSound() {
  if (source) {
    source.noteOff(0);
  }
}

function playSound() {
  // source is global so we can call .noteOff() later.
  source = context.createBufferSource();
  source.buffer = audioBuffer;
  source.loop = false;
  source.connect(setupChain(context.destination));
  source.noteOn(0); // Play immediately.
}

function initSound(arrayBuffer) {
  context.decodeAudioData(arrayBuffer, function(buffer) {
    // audioBuffer is global to reuse the decoded audio later.
    audioBuffer = buffer;
    var buttons = document.querySelectorAll('button');
    buttons[0].disabled = false;
    buttons[1].disabled = false;
  }, function(e) {
    console.log('Error decoding file', e);
  }); 
}


var fileChangeEventListener = function(e) {  
  var reader = new FileReader();
  reader.onload = function(e) {
    initSound(this.result);
  };
  reader.readAsArrayBuffer(this.files[0]);
}
4

1 に答える 1