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

我很难理解如何在Java项目中将声音数据波绘制到图形上的想法。
我必须使用UI完全从头开始进行此分配,因此基本上要制作.wav文件编辑器。
我遇到的主要问题是将声音数据放入要绘制的图形中。目前,我有一个随机生成的值数组,现在正在绘制。

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

我正在使用FileInputStream读取它并进行验证:RIFF字节(0-3),FileLength(4-7),WAVE字节(8-11),然后是格式块format(从RIFF块的末尾开始) ;然后将索引放置在索引的末尾,并给出格式0-3,格式块的长度4-7,然后是wave文件的所有规范的后16个字节,并将其存储在相应的命名变量中。

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

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

最佳答案

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

鉴于您几乎总是拥有比可用像素大得多的样本数量,因此明智的做法是从缓存的样本数据缩减或“摘要”中提取数据。通常,这就是音频编辑器(例如Audacity)呈现音频数据的方式。实际上,最常见的策略是计算每个像素的样本数,然后为SamplesPerPixel大小的每个块找到最大和最小样本,然后在每个最大-最小对之间绘制一条垂直线。您可能要缓存此缩减,或者针对不同的缩放级别缓存一系列缩减。 Audacity缓存到磁盘上的临时文件(“阻止文件”)。

上面的内容可能过于简单化了,因为实际上,您将要从固定大小的块(例如256个样本)而不是从SamplesPerPixel的大小中计算出初始最大-最小对。然后,您可以从该缓存的减少量中进一步计算“即时”减少量。关键是SamplesPerPixel通常是一个动态量-因为用户可以随时调整 Canvas 的大小(希望如此……)。

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

This页面显示了如何使用Java Swing构建基本的波形显示。我没有详细研究它,但是我认为它只是对数据进行下采样,而不是计算最大-最小对。当然,这将不会提供与max-min方法一样精确的减少量,但是更容易计算。

如果您想知道如何正确执行操作,则应深入研究Audacity源代码(但是请注意,它是相当陈旧的C++)。要获得一般概述,您可以查看Audacity的原始作者Dominic Mazzoni的'A Fast Data Structure for Disk-Based Audio Editing'。但是,您需要从CMJ购买。

关于java - 如何从wav文件中提取声音数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12879210/

10-09 05:33
查看更多