私は以前、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 モジュール プレーヤーです。