我正在使用 Web Audio API 来显示正在播放的音频的可视化。我有一个控制播放的元素,然后我通过从该元素创建一个节点将<audio>
它连接到 Web 音频 API 。然后将其连接到 a和 an 。的设置为。然后将 连接到。MediaElementSource
<audio>
GainNode
AnalyserNode
AnalyserNode
smoothingTimeConstant
0.6
GainNode
AudioContext.destination
然后我调用我的音频处理函数:onAudioProcess()
. 该函数将使用以下方法不断调用自身:
audioAnimation = requestAnimationFrame(onAudioProcess);
该函数使用音频中的AnalyserNode
to getByteFrequencyData
,然后循环遍历(现在已填充)并在元素的 2d 上下文中Uint8Array
绘制每个频率幅度。<canvas>
这一切都很好。
我的问题是,当您暂停<audio>
元素时,我的onAudioProcess
函数会继续循环(通过请求自身的动画帧),这会不必要地占用 CPU 周期。我可以cancelAnimationFrame(audioAnimation)
,但这会在画布上留下最后绘制的频率。我也可以通过调用画布的 2d 上下文来解决这个问题,但与仅让音频处理循环继续(由于.clearRect
smoothingTimeConstant
所以我最终做的<audio>
是在取消动画帧之前在暂停时设置超时。这样做我能够在没有音频播放时节省 CPU 周期,并且我仍然能够保持平滑降低<canvas>
.
我的问题:如何根据AnalyserNode
's 的smoothingTimeConstant
值准确计算频率幅度为 255 达到 0(范围为 0-255)所需的毫秒数,以便我可以正确设置超时以取消动画帧?