4

私は Web Audio API が大好きです。可能性は素晴らしいです。とは言っても、まだ初期段階です。私が最も心配しているのは、不要になったバッファー/サウンドを解放する方法がわからないことです。ウェブソケットを介して接続されたミュージシャン/DJ/モデレーターからのライブサウンドをミキシングするため、常に新しいサウンドのサウンドバッファー。

次のコードは、行内の新しいバッファーの再生のロードをシミュレートします。エフェクトのミキシングを追加して、誰もが彼のパフォーマンスでライブ結果を聞くことができるようにするには、Web オーディオ API が必要です。

残念ながら、このコードは RAM 全体を消費し、モバイル サファリとデスクトップ サファリの両方をクラッシュさせます。それらが再生された後、それらの大きなバッファーを解放する方法がわかりません。また、それらはもう必要ありません。新しい大きなデータをメモリ内の代わりにロードする必要があります。誰か考えがありますか?そうしないと、再生された最初の 8 つのファイルがロードできなくなります。

var context = new webkitAudioContext();
var total=0;

function onTouchStart(){
    setInterval(function(){
    total+=10;
    source = context.createBufferSource();    
    source.connect(context.destination); // simulates loading large file
    source.buffer=context.createBuffer(1, 10*1024*1024, context.sampleRate);
    source.noteOn(0);
    source.noteOff(0); // acording to w3c spec resources should be deleted immediately.
    // making source property and call delete or =null will release nether source or buffer i am desperate.
    console.log(total,'mb'); //
    },1000);
}

document.addEventListener( "touchstart", onTouchStart );
document.addEventListener( "click", onTouchStart );
4

1 に答える 1

2

JavaScriptのメモリ管理では、ガベージコレクションを使用して、用語を「すぐに」相対的なものにします。Webkitが解放する時期であると判断するまで、バッファーは実際には解放されません。Chromeデベロッパーツールでタイムラインの記録を行うことで、これを実際に確認できます(ただし、Safariで記録する方法があるかどうかはわかりません)。その方法については、次の記事を確認してください:https ://developers.google.com/chrome-developer-tools/docs/timeline

また、イベントリスナーをドキュメントに添付しているため、デバイスをタップするたびに別の間隔のラウンドが開始されます。したがって、デバイスを2回タッチすると、2倍の量のバッファーが作成されます。毎秒20MBを意味します。

そうは言っても、実際に実際のファイルを再生しながらこれを試したことはありますか?ガベージコレクターはファイルの再生中に追いつくことができるので、おそらくこの問題は発生しません。10mbの大きなmp3またはoggは数分のオーディオに相当します。

お役に立てば幸いです。

于 2013-01-11T18:14:22.083 に答える