当前位置: 首页 > 面试题库 >

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

淳于哲
2023-03-14
问题内容

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

我很难理解如何在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购买。



 类似资料:
  • 在我的应用程序中,我下载了Android系统的扩展文件- 我尝试将APK扩展Zip库用作: 但是expansionFile总是空的。这个obb文件是用Jobb创建的,用于文件夹obb/file。拉链

  • 问题内容: 我正在尝试从音频文件(WAV文件)中提取振幅阵列。我将使用此振幅数组绘制给定wav文件的振幅与时间的关系图。我可以自己绘制图形,但不知道如何从Java中给定的audio(wav)文件提取振幅? 问题答案: 这是您可以使用的帮助程序类。该方法是您需要获得振幅的方法: 它还可以播放文件,以便您可以对其进行测试,但只能播放8位或16位文件。对于其他情况,您只能阅读它们。 另外,请查看这些图以

  • 问题内容: 我有一个看起来像这样的csv文件 我想要一张桌子: 如果我使用,我会得到 吗?有什么优雅的方法吗? 问题答案: 您可以用来解析CSV文件,而不必担心自己解析。 PHP手册中的示例:

  • 问题内容: 我正在尝试使用提取此 PDF文件中包含的文本。 我正在使用PyPDF2模块,并具有以下脚本: 运行代码时,得到以下输出,该输出与PDF文档中包含的输出不同: 如何提取PDF文档中的文本? 问题答案: 要从PDF提取文本,请使用以下代码

  • 下面的“build.gradle”: 当您运行时: 它产生: 我肯定这一定是可能的,那么你是怎么做到的呢?

  • 问题内容: 以下代码将频率为400Hz的简单正弦写入单声道WAV文件。为了产生 立体声 WAV文件,应如何更改此代码。第二个频道应处于不同的频率。 问题答案: 使用另一个频率/频道set来构建一个并行列表,并在输出循环中将其用作标题子句,并使用两个调用来创建主体- 一个用于,一个用于。IOW,文件中两个通道的对应帧“交替”。 例如参见本页面的所有可能的WAV文件格式的全面描述,我引用: 多通道数字