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

Ali*_*our 1 audio wav dart flutter

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

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

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

Sco*_*and 6

野外的自然音频是曲线的连续摆动.. 想象一下您的耳膜或麦克风的薄膜或鼓皮...数字音频是记录为一系列音频样本的同一曲线...通常每秒记录 44100 个样本,每个样本记录该曲线高度的 16 位分辨率,这意味着原始音频曲线上给定点的 2^16 == 65,536 个可能的不同高度值(更详细地研究 PCM 音频)...因此,单个音频样本幅度代表特定时间点的曲线高度,我们将其称为 s1 ...原始音频曲线上绘制的高度是该样本的幅度

读取 WAV 格式文件时,前 44 个字节是标头,后跟有效负载,其中包含音频每个通道的原始音频曲线(单声道一个通道、立体声 2 个通道等)...通常使用多个麦克风录制音频然而,为了制作一张音频CD,音乐工作室将多轨音频(最初可能有几十个通道)混合成两个音频通道(一个用于左扬声器,一个用于右扬声器,即立体声,即两个通道)......这个标题会告诉你有效负载中出现的这些关键细节:sample_rate(每个通道每秒捕获的音频样本数)、每个样本的位深度(用于存储给定通道的每个音频样本的数据位数)、有效负载大小(以字节为单位)、和通道数...您可以自己编写一个 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
Run Code Online (Sandbox Code Playgroud)

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