1

Web オーディオでは、ScriptProcessor ノードを Chrome で動作させることができませんが、Firefox では正常に動作します。

// Create audio context (Chrome/Firefox)
var context;
if (window.AudioContext) {
    context = new AudioContext(); 
} else {
    context = new webkitAudioContext(); 
}

// Create oscillator and start it
oscillator = context.createOscillator();
oscillator.start(0);

// Set up a script node that sets output to white noise
var myscriptnode = context.createScriptProcessor(4096, 1, 1);
myscriptnode.onaudioprocess = function(event) {
    console.log('Processing buffer');
    var output = event.outputBuffer.getChannelData(0);
    for (i = 0; i < output.length; i++) {
        output[i] = Math.random() / 10;
    }
};

// Connect oscillator to script node and script node to destination
// (should output white noise)
oscillator.connect(myscriptnode);
myscriptnode.connect(context.destination);

// NOTE: This commented-out code connects oscillator directly to
// destination, which works in Chrome as well as Firefox.
//oscillator.connect(context.destination);

このサンプルの期待される結果は、1/10 の音量でホワイト ノイズを再生することです (オシレーターは実際には無視されます)。

このコードはhttp://jsfiddle.net/78yKV/3/で試すことができます。Firefoxでは、この URL はすぐにホワイト ノイズを再生することに注意してください。Chrome 30 では、エラーは発生しませんが、オーディオ出力も発生しません。Chrome 31 ベータ版もチェックインしましたが、同じ結果が得られました。「Processing buffer」ログ エントリは表示されません。

一般的なオーディオ システムをテストするには、最後の行のコメントを外してオシレーターを宛先に直接接続すると、Chrome でオーディオ (オシレーター トーン) が正しく再生されます。しかし、ScriptProcessor を Chrome で動作させることができません。

ScriptProcessor を使用してチュートリアルなどをネットで検索しましたが、実行可能な例が含まれていないか、機能しない (または複雑すぎる) ものを見つけました。

(明確にするために、これは簡略化されたサンプルであり、実際にやろうとしていることとはまったく関係がないため、ScriptProcessor を使用してホワイト ノイズを生成するべきではないとは言わないでください。 . それは目的ではありません; 実際の使用のためには、ScriptProcessor が機能することが絶対に必要です。)

イベント名が間違っているなど、非常に愚かなことをしている可能性が最も高いと思いますが、それが見つかりません。誰でも助けることができますか?

4

1 に答える 1

1

他のいくつかのマシンでチェックしたところ、問題は私のマシンのデフォルトのオーディオ デバイスに固有のものであると思われます。これは、Microsoft のデフォルトの USB オーディオ ドライバを使用する受話器です。Chrome のメニュー オプションを使用して Google に報告しました。私の推測では、ハンドセットが 16 kHz のモノラル出力しかサポートしていないために問題が発生し、どういうわけかこれが Chrome を混乱させているのではないかと推測されます。

同じメーカーのハンドセットを持つ同僚のマシンでバグを再現できます。繰り返します:

  • ハンドセットを使用している場合、Firefox は両方のマシンで正しく動作します。
  • 別の出力デバイスを選択すると、どちらのマシンも Chrome で正しく動作します。
  • 受話器を使用している場合でも、Chrome でオシレータの再生が正しく機能します。

テストコードの最終版http://jsfiddle.net/78yKV/7/

function doStuff(osc) {
  // Create audio context (Chrome/Firefox)
  var context;
  if (window.AudioContext) {
    context = new AudioContext(); 
  } else {
    context = new webkitAudioContext(); 
  }

  // Set up a script node that sets output to white noise
  var myscriptnode;
  if (context.createScriptProcessor) {
    myscriptnode = context.createScriptProcessor(4096, 1, 1);
  } else {
    myscriptnode = context.createJavaScriptNode(4096, 1, 1);
  }
  var buffer = 1;
  myscriptnode.onaudioprocess = function(event) {
    console.log('Processing buffer ' + (buffer++));
    var output = event.outputBuffer.getChannelData(0);
    for (i = 0; i < output.length; i++) {
      output[i] = Math.random() / 10;
    }
  };

  // Connect script node to destination
  if (osc) {
    oscillator = context.createOscillator();
    oscillator.start(0);
    oscillator.connect(context.destination);
  } else {
    myscriptnode.connect(context.destination);
  }
}

このスクリプトによるホワイト ノイズの再生 (実際には少し前のテスト バージョンですが、同じだと思います) は、Windows 7、Windows 8.1、Linux、および Android 4.1 上の Chrome 30 で動作します。Windows 上の Firefox で。iPad (最新の OS) で; Safari 6.0.5 を使用している Mac でも同様です (そこで開発者ツールを開くと壊れますが、そうしない限り動作します)。上記の USB 電話ハンドセット (Polycom CX300) を使用している場合にのみ失敗します。

言い換えれば、apsillers が示唆したように、これは依然として Chrome のバグのように見えますが、かなり具体的なものです。(ちなみに、最新の「Canary」バージョンの Chrome も試しましたが、役に立ちませんでした。)

于 2013-11-07T16:36:41.187 に答える