如何从wav文件中提取声音数据?

首先,这是用于家庭作业或…项目。

我很难理解如何在Java项目中将声音数据波绘制到图形上的想法。我必须使用UI完全从头开始进行此分配,因此基本上要制作.wav文件编辑器。

到目前为止,我有一个微型程序正在运行并验证wav文件,使其实际上是wav文件。

我正在使用FileInputStream读取它并进行验证:RIFF字节(0-3),FileLength(4-7),WAVE字节(8-11),然后是格式块format(从RIFF块的末尾开始)

;然后将索引放在索引的末尾,并给出格式0-3,格式块4-7的长度,然后是wave文件的所有规范的下一个16个字节,并将其存储在其适当的命名变量中。

一旦到达DATA块及其长度,这就是我所有的声音数据,这就是我不确定如何存储每个字节的声音数据,甚至无法将其转换为与振幅相关的值的原因。声音。我以为验证是相似的,所以会是一样的,但事实并非如此……自从我盯着这几天以来,或者我一直在使一些超级简单的事情变得复杂。

任何帮助表示赞赏,谢谢。

回答:

我不是Java程序员,但是我对渲染音频有些了解,因此希望以下内容会有所帮助…

鉴于您几乎总是拥有比可用像素大得多的样本数量,因此明智的做法是从缓存的样本数据缩减或“摘要”中得出。通常,这就是音频编辑器(例如Audacity)呈现音频数据的方式。实际上,最常见的策略是计算每个像素的样本数量,然后为每个大小的块找到最大和最小样本SamplesPerPixel,然后在每个最大-

最小对之间绘制一条垂直线。您可能要缓存此缩减,或者针对不同的缩放级别缓存一系列缩减。Audacity缓存到磁盘上的临时文件(“阻止文件”)。

上面的内容可能过于简单化了,因为实际上,您将要根据固定大小的块(例如256个样本)而不是大小之一来计算初始最大-

最小对SamplesPerPixel。然后,您可以从缓存的减少量中进一步计算“即时”减少量。关键是SamplesPerPixel通常是动态数量-

因为用户可以随时调整画布的大小(希望的大小…)。

还要记住,在绘制到画布上时,需要按画布的宽度和高度缩放样本值。最好的方法(至少在垂直方向上)是对样本进行归一化,然后乘以画布高度。16位音频由[-32768,32767]范围内的样本组成,因此要进行归一化,只需将浮点数除以32768。然后反转符号(将波形翻转到画布坐标),加1(以补偿为负值),然后乘以画布高度的

一半 。无论如何,我就是这样做的。

该页面显示了如何使用Java Swing构建基本的波形显示。我没有详细研究它,但是我认为它只是对数据进行下采样,而不是计算最大-

最小对。当然,这将无法提供与max-min方法一样精确的减少量,但是更容易计算。

如果您想知道如何正确地做事,则应该深入研究Audacity源代码(但是请注意,它是相当粗糙的C

++)。要获得一般概述,您可以查看Audacity的原始作者Dominic

Mazzoni的“基于磁盘的音频编辑的快速数据结构”。但是,您需要从CMJ购买。

以上是 如何从wav文件中提取声音数据? 的全部内容, 来源链接: utcz.com/qa/430995.html

回到顶部