d3.js - 如何解释 Web Audio API getByteFrequencyData 0 值?
问题描述
我实际上正在使用 Web Audio API 和 D3 开始一个关于音乐可视化的小项目。我使用的getByteFrequencyData()
方法如下(为了清楚起见,已经修改了实现。这只是一个“设置模型”):
const ctx = new (window.AudioContext || window.webkitAudioContext)()
const analyzer = ctx.createAnalyser()
const src = ctx.createMediaElementSource(audioPlayer)
analyzer.fftSize = 512
src.connect(analyzer)
src.connect(ctx.destination)
//...
const getFrequencyData = () => {
audioAnimationFrameId.current = requestAnimationFrame(getFrequencyData)
const bufferLength = audioAnalyzer.frequencyBinCount
const data = new Uint8Array(bufferLength) // 256
audioAnalyzer.getByteFrequencyData(data)
return data
}
if (audioAnalyzer && isAudioPlaying) getFrequencyData()
我的问题是,在我的 Uint8Array 上,我得到了很多“0”(主要在数组的末尾),这打破了我的径向图表(因为 D3 比例域取决于数据数组长度)。我知道这些值代表某个频率的分贝,但是最后得到所有这些零是正常的吗?
我猜我可能错过了分析仪上的一些配置,但是经过大量测试后我找不到任何解决方案......我错过了什么,或者这些值是否正确,最后是 D3我应该改变的规模?
这是我的 D3 秤:
const angle = scaleLinear({
domain: [0, 256], // NB: the array length
range: [0, Math.PI * 2]
})
const radius = scaleLinear({
domain: [0, 255], // NB: frequency data goes from 0 to 255
range: [0, (DIAMETER / 2)]
})
如果有人能帮助我理解这些奇怪的结果,那就太好了!
多谢!
解决方案
请参阅getByteFrequencyData的规范。那里的公式解释了为什么值为零。基本上在较高频率下,实际 dB 值低于 dB_min,因此它被钳制为零。如果您不想要这个并且可以使用浮点值,请使用getFloatFrequencyData。
推荐阅读
- linux - 单个 shell 脚本文件中的多个 CURL
- c# - Sage 300 V2020开发环境
- javascript - 如何在点击事件时在 amchart 饼图切片上调用 setState 或函数
- python - 使用 Plotly 在热图的单元格上添加矩形补丁
- php - 存储 Autodesk-Forge 刷新令牌的最佳方式
- angular - 如何以循环角度激活组件?
- android - 在没有弹出窗口的情况下删除 sdcard 文件
- c - 如何从 unix 管道建立非阻塞读取?
- javascript - 将项目添加到数组(非嵌套) - Google App Script
- entity-framework - 使用单个参数 Id 搜索记录列表并与多列 EF 进行比较