Web Audio APIを使用して、再生中のオーディオの視覚化を表示しています。<audio>
再生を制御している要素があり、要素MediaElementSource
からノードを作成してWebAudioAPIに接続し<audio>
ます。次に、aGainNode
とに接続されAnalyserNode
ます。'sはに設定されますAnalyserNode
smoothingTimeConstant
0.6
。次に、GainNode
がに接続されますAudioContext.destination
。
次に、オーディオ処理関数を呼び出しますonAudioProcess()
。その関数は、以下を使用して継続的に自分自身を呼び出します。
audioAnimation = requestAnimationFrame(onAudioProcess);
この関数は、オーディオからのAnalyserNode
toを使用してから、(現在入力されている)をループし、要素の2Dコンテキストで各周波数の大きさを描画します。これはすべて正常に機能します。getByteFrequencyData
Uint8Array
<canvas>
私の問題は、<audio>
要素を一時停止すると、onAudioProcess
関数がループし続け(それ自体でアニメーションフレームを要求することにより)、CPUサイクルを不必要に消費することです。できますcancelAnimationFrame(audioAnimation)
が、最後に描画された周波数がキャンバスに残ります。キャンバスの2Dコンテキストも呼び出すことで解決できますclearRect
が、オーディオ処理ループを続行するだけの場合と比べると、非常に奇妙に見えます(これにより、各バーがキャンバスの下部にゆっくりと下がりますsmoothingTimeConstant
)。
だから私がやったの<audio>
は、アニメーションフレームをキャンセルする前に、が一時停止したときにタイムアウトを設定することでした。これを行うことで、オーディオが再生されていないときにCPUサイクルを節約でき、に描画された周波数バーのスムーズな低下を維持することができました<canvas>
。
私の質問:アニメーションフレームをキャンセルするためのタイムアウトを適切に設定できるように、AnalyserNode
の値に基づいて、255の周波数の大きさが0(範囲は0〜255)に達するまでにかかるミリ秒数を正確に計算するにはどうすればよいですか?smoothingTimeConstant
?