java中的wav幅度(立体声或更多通道)
大家好,有谁知道如何用 Java 查找 WAV 文件中的幅度吗?如果文件是立体声的(或有更多通道),如何将数据放入数组中?
谢谢!
Hi does anyone know how to find the amplitudes within a WAV file in Java? If the file was stereo (or has more channels) how can the data be put into arrays?
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
处理 WAV 文件头
下一个技巧还有更多这是一个挑战,因为内部数据格式可能是多种数据类型。如果您正在查看经典的 Windows WAV 文件,它可能只是 PCM 16 位或可能是 8 位。这意味着,您可以轻松地将数据加载到字节或短数组中。
但是,您会发现其他格式。当你知道自己的类型后,用谷歌搜索一下。您会找到大多数信息。
Processing a WAV file header
Next trick is a bit more of a challenge as the internal data format could be a variety of data types. If you are looking at your classic windows WAV file, it is probably just PCM 16 bit or maybe 8 bit. Which, means, you can easily load the data into a byte or short array.
However, you will find other formats. When you know the type you have, google it. You'll find information for most.
如何从 inputStream 打开 WAVE
之后,典型的 WAVE 文件是 PCM 编码的(还有其他编解码器,如浮点数)。您必须从
markSupportedInputStream
读取示例。PCM 包括许多参数组合:(单声道|立体声)、(有符号|无符号)、(8 位|16 位)、(8 位以上的大端|小端)。您可以在
format
对象上计算出这一点,例如format.getChannels()
。为此,我编写了一个PcmCodec
类,其中包含诸如decodeUnsigned16BitLittleEndian(buffer, offset)
之类的方法。我将样本值标准化为 [-1,1]。以下是我如何找出 PCM 的方法:
以下是我如何解码特殊 PCM 的示例:
您需要从
markSupportedInputStream
读取到字节数组(缓冲区)。之后,您可以解码字节:How to open a WAVE from inputStream
After that, a typicall WAVE file is PCM encoded (there a other codecs, like floats). You have to read the samples from
markSupportedInputStream
.PCM includes many combinations of parameters: (Mono|Stereo), (Signed|Unsigned), (8 Bit|16 Bit), (Big Endian|Little Endian for more than 8 Bit). You can figure out this on the
format
object likeformat.getChannels()
. For this reason I have written aPcmCodec
class with methods likedecodeUnsigned16BitLittleEndian(buffer, offset)
. And I normalize the sample values to [-1,1].Here is how I figure out what PCM it is:
Here is an example how I decode a special PCM:
You need to read from
markSupportedInputStream
into a byte array (buffer). After that, you can decode the bytes: