3

私は以前、Web Audio API でJavaScriptAudioNodeを使用して、Chrome と Safari 6.0 の両方でオーディオの合成とミキシングに成功しました。ただし、最新バージョンの Safari は、ソース バッファを埋めるためにonaudioprocessを呼び出さないため、動作していないように見えます。

これは、 onaudioprocessへの呼び出しごとに無音のみを再生し、テキストをドキュメント本文に追加する簡単な例です。

<html>
<head>  
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script type="text/javascript">    
$(document).ready(function() {
  $("a").click(function() {    
    var context = new webkitAudioContext(); 
    var mixerNode=context.createJavaScriptNode(2048, 0, 2);                

    mixerNode.onaudioprocess=function(ape) {                     
      var buffer=ape.outputBuffer;
      for(var s=0;s<buffer.length;s++)
      {  
        buffer.getChannelData(0)[s]=0;      
        buffer.getChannelData(1)[s]=0;       
      }
      $("body").append("buffering<br/>");
    };               

    $("body").html("");               
    mixerNode.connect(context.destination);               
    return false;
  });                                                          
});                         
</script>    
</head>  
<body>  
<a href="#">start</a>        
</body>  
</html>

上記の例は、Chrome では期待どおりに機能しますが、デスクトップ Safari では機能しません。Safari の iOS バージョンも動作しませんが、そもそも動作しませんでした。

context.createJavaScriptNodeを呼び出すと、タイプJavaScriptAudioNodeの適切なオブジェクトが返され、それを宛先ノードに接続しても例外はスローされません。context.activeSourceCountはゼロのままですが、これは Chrome にも当てはまります。明らかにタイプAudioBufferSourceNodeのアクティブなノードのみをカウントするためです。context.currentTimeも期待どおりに増加します。

ここで何か間違ったことをしているのですか、それとも実際のバグなのか、Safari に欠けている機能なのですか? Apple のドキュメントには、JavaScriptAudioNode (または新しい名前のScriptProcessorNode ) についての言及はありませんが、Safari 6 の最初のリリースの前には機能していました。上記の例が注意を払う必要があるため、ユーザー入力に対する iOS Safari の要件は役に立たないようです。その。

簡単な例はここにあり、より複雑な例は、同じ動作を示す私のProtracker モジュール プレーヤーです。

4

1 に答える 1

4

Safari の Web Audio API の実装には、注意が必要なバグがいくつかあります。最初はcreateJavaScriptNodeコンストラクターにあります...「入力チャネル」パラメーターが0に設定されていることに問題があるようです。これに変更してみてください:

createJavaScriptNode(2048, 1, 2)

2 番目の問題は、ガベージ コレクションに関するものです (と思います)。mixerNode 変数が範囲外になると、Safari はonaudioprocessコールバックの起動を停止するようです。解決策の 1 つは、mixerNode を最上位のスコープに導入し (つまりvar mixerNode;、スクリプトの先頭で宣言する)、JavaScriptNode をその最上位の変数に格納することです。複数の mixerNode を動的に作成する予定がある場合は、それらへの参照を最上位の配列変数に格納することで同じ効果を得ることができます。

これら 2 つの変更を行うと (入力チャネル パラメータを 1 に設定し、mixerNode への参照を維持する)、スクリプトは Safari で期待どおりに動作するはずです。

于 2013-01-25T20:42:41.427 に答える