将音频数据转换为波形数据?

Posted

技术标签:

【中文标题】将音频数据转换为波形数据?【英文标题】:Turning audio data into waveform data? 【发布时间】:2021-04-09 08:03:28 【问题描述】:

我不明白这个https://github.com/bbc/peaks.js/blob/master/demo/TOL_6min_720p_download.json 怎么能变成带有峰值的波形可视化。

我看到该文件中的数据是一个扁平的数字数组。我正在尝试了解如何将这些数字转换为对视觉绘图有意义的东西。

查看此小提琴以更深入地了解代码https://codesandbox.io/s/cool-dijkstra-fyw25?file=/src/App.js

目标是创建看起来像图像的高低峰。我假设每 2 个索引代表一个峰值,但我不想假设任何事情。

我正在提取 JSON 并将其传递给这样的绘图函数

  const peaksReq = await fetch(
    "https://raw.githubusercontent.com/bbc/peaks.js/master/demo/TOL_6min_720p_download.json"
  );
  const peaksData = await peaksReq.json();
  const peaks = peaksData.data;

  // peaks is now a flat array of numbers

目标是将平峰阵列变成如上图所示的条形。第一组数据是一堆 0,最终是一个有意义的序列,看起来像这样[-7,5,-27,25,-30,26,-29,30,-24,26]

我的理解——猜测是将其转换为像 [[-7,5],[-27,25],[-30,26],[-29,30],[-24,26]] 这样的二维数组,然后将这些数字转换为适合边界的 px。 -7, 5 会相对于中心公理上下波动。

我不太明白如何解决的问题是,如果它在 40px 元素内,我们如何保持这些数字相对。即 40px 的中心是 20px。条形在距其中心 40px 的空间内向上移动而不会超出界限的最大值为 20px,您可以添加一个 5px 的缓冲区,例如 15px。

【问题讨论】:

听起来像简单的数学......从数字数组中获取最大值和最小值,这些将是您的相对最大值和最小值,其他所有内容都是其中的百分比。 是的,但我很笨,需要向我解释或参考 大声笑,你不傻,我之前帮过你一个类似的问题:***.com/questions/61903270/… ...让我们看看我能不能把这个放在代码示例中 【参考方案1】:

扩展我关于获取最大值和最小值的评论,然后我们获取相对值,我正在按照您的建议进行 15px 边界,因此中心将为 0,上限为 15px,下限绑定 -15px 将用于我们的计算...

这是我们可以做的:

async function start() 
  const peaksReq = await fetch(
    "https://raw.githubusercontent.com/bbc/peaks.js/master/demo/TOL_6min_720p_download.json"
  );
  const peaksData = await peaksReq.json();
  const peaks = peaksData.data;

  const max = Math.max(...peaks)
  console.log(max, 15)
  
  const min = Math.min(...peaks)
  console.log(min, -15)
  
  console.log("---------------")
  for (let i = 801; i < 805; i++) 
    let val = peaks[i] * 15 / max
    if (peaks[i] < 0)
      val = peaks[i] * -15 / min
    val = Math.round(val*10)/10
    console.log(peaks[i], val)
   


start()

我只是在输出中对 peaks 数组进行采样,但这正是您所需要的

【讨论】:

我明白了。感谢您花时间这样做。我正在脑海中经历它...我不确定的一件事是如何将峰成对绘制为条形的顶部和底部.. @MichaelJosephAubry 我会这样做:codesandbox.io/s/long-firefly-pefqw?file=/src/App.js 哦,太漂亮了.. 非常感谢.. 我在哪里可以了解有关该数据频率如何工作的更多信息。我将研究这段代码:) 对不起,我不是数据频率方面的专家,这个问题看起来很简单,如果您需要专业服务,请在 gmail 上联系我

以上是关于将音频数据转换为波形数据?的主要内容,如果未能解决你的问题,请参考以下文章

在不同的波形格式之间转换 (WAVEFORMATEX)

如何将 mp3 转换为带有 n 音频的波形而不将其保存到硬盘?

音频相关的基本知识

Python 3:将波形数据(字节数组)转换为浮点值的 numpy 数组

如何将音频数据数组转换为 wav 文件?

将录制的音频转换为数字数据