如何从我的wav文件中绘制声音数据?

Kev*_*eng 7 java audio drawing wav javasound

首先,这是为家庭作业或...项目.

我无法理解如何在Java中为项目绘制声音数据波的想法.我必须完全从头开始使用UI进行这项任务,所以基本上都是制作.wav文件编辑器. 我遇到的主要问题是将声音数据输入要绘制的图形中.目前,我正在绘制一个随机生成的值数组.

到目前为止,我有一个运行并验证wav文件的迷你程序实际上是一个wav文件.

我正在使用FileInputStream读取它并验证:RIFF字节(0-3),FileLength(4-7),WAVE字节(8-11),然后是格式块格式(从RIFF块的末尾开始) ;并将索引定位到它的末尾,并给出格式0-3,格式块4-7的长度,然后是波形文件的所有规范的下一个16字节,并将它们存储在适当的命名变量中.

一旦我到达DATA块并且它的长度超过了我的所有声音数据,这就是我不确定如何将每个字节存储为声音数据的字节,甚至将其转换为与振幅相关的值.声音.我认为验证是相似的,所以它会是相同的,但它似乎不是那样的...要么那么,或者我一直在使一些非常简单的事情复杂化,因为我已经盯着这几天了.

任何帮助表示赞赏谢谢.

Chr*_*isM 16

我不是Java程序员,但我对渲染音频知之甚少,所以希望以下内容可能有所帮助......

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

然而,上面的内容可能过于简单了,因为实际上你需要从一大块固定大小(比如256个样本)计算初始最大 - 最小对,而不是从大小中计算一个SamplesPerPixel.然后,您可以从缓存的减少量中进一步计算"即时"减少量.关键是SamplesPerPixel通常是一个动态数量 - 因为用户可能随时调整画布大小(希望有意义......).

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

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

如果你想知道如何正确地做事,你应该深入了解Audacity源代码(但要注意 - 它是相当粗糙的C++).要获得一般概述,您可以查看Audacity的原作者Dominic Mazzoni撰写的"基于磁盘的音频编辑的快速数据结构".但是,您需要从CMJ购买.