读取 wav 音频文件并在 dart 和 flutter 中获取与时间相关的振幅数据以进行绘图

Reading wav audio files and get amplitude data in relation to time in dart and flutter for plotting

我想读取 wav 文件并在 dart 中获取与时间相关的振幅数据,以便在 dart 中使用它并使用 flutter 在图表中绘制它

起初我使用 flutter_ffmpeg 将 .mp3 和 .m4a 文件转换为 wav 文件,但我想读取这些文件并获取采样率和振幅 并尝试将现有文件绘制成图表,y 轴为振幅,x 轴为时间

我的问题是关于从 .wav 或 .pcm 文件中提取振幅和其他 wav 信息,因为我在网上找不到文档。

野外的自然音频是曲线的连续摆动..想想你的耳鼓或麦克风的薄膜或鼓皮......数字音频是记录为音频进程的相同曲线样本...通常每秒记录 44100 个样本,每个样本记录该曲线高度的 16 位分辨率,这意味着原始音频曲线上给定点的 2^16 == 65,536 个可能的不同高度值(更多细节研究 PCM audio ) ...所以单个音频样本振幅代表特定时间点的曲线高度,我们称之为 s1 ...原始音频曲线上绘制的这个高度是该样本的振幅

当读取 WAV 格式文件时,前 44 个字节是 header,然后是包含每个音频通道(单声道、立体声 2 通道等)的原始音频曲线的有效负载。 .. 通常,音频是使用许多麦克风录制的,但是为了创建音频 CD,音乐工作室将多轨音频(最初可能有几十个通道)混合成两个音频通道(一个用于左扬声器,一个用于右扬声器,这意味着立体声是两个通道) ... 这个 header 将告诉您负载中出现的这些关键细节:sample_rate(每个通道每秒捕获的音频样本数),每个样本的 bit_depth(数字用于存储给定通道的每个音频样本的数据位)、以字节为单位的有效载荷大小和通道数……您可以自己编写 WAV 解析器(大约需要两页代码)或使用库来检索这些数据结构...一旦解析了 WAV 文件有效负载中的原始音频,将为您提供原始音频每个通道的曲线 s1、s2、s3 等 ...

通常,当人们需要确定振幅时,他们指的是许多音频样本的曲线高度的总和……s1、s2、s3……给这只猫蒙皮的一种方法是计算均值根一组音频样本的平方生成一个 currAmplitude 聚合振幅值,然后及时向前滑动以重复另一组音频样本点......给定 RMS 计算中的样本数量取决于您,可能多 1k 或 2k或更少,具体取决于您对 CPU 消耗的胃口和此聚合幅度测量的分辨率

currAmplitude = square_root_of(  (  s1*s1 + s2*s2 + s3*s3 + ... sn*sn ) / n )  // this is the RMS forumula

请记住每个音频样本都有自己的振幅,也许您可​​以简单地绘制这些(s1、s2、s3、...)或者重复执行高于 RMS 的操作以获得一组更有用的总振幅如果需要一般的大概幅度而不是每个样本的瞬时幅度