【问题标题】:How to interprete Web Audio API getByteFrequencyData 0 values?如何解释 Web Audio API getByteFrequencyData 0 值?
【发布时间】:2020-12-01 05:35:17
【问题描述】:

我实际上是在开始一个关于音乐可视化的小项目,使用 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)]
})

如果有人能帮我理解这些奇怪的结果,那就太好了!

非常感谢!

【问题讨论】:

  • 我对@9​​87654325@一无所知,但如果你得到不需要的值,你可以过滤掉trailing zeroes,例如

标签: d3.js data-visualization web-audio-api


【解决方案1】:

请参阅getByteFrequencyData 的规范。那里的公式解释了为什么这些值为零。基本上在较高频率下,实际 dB 值低于 dB_min,因此它被钳制为零。如果您不想要这个并且可以使用浮点值,请使用getFloatFrequencyData

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    相关资源
    最近更新 更多