Java - 将 WAV 文件读取为浮点数组
我正在尝试读取 WAV 文件(将来还会 MP3 和 Ogg) 文件作为 Java 中的浮点数组,类似于 libsndfile 在 C 中。
我正在查看 javax.sampled 包中的各种文档,但我找不到关于如何做到这一点的明确解释;如果可能的话,我想避免重复使用外部库。
有什么建议吗?
I'm trying to read a WAV file (and in the future also MP3 and Ogg) file as an array of floats in Java, much like libsndfile in C.
I'm looking at the various documentation in the javax.sampled packages, but I can't find a clear explanation on how to do that; I'd like to avoid recurring to external libraries if possible.
Any suggestion?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
JavaSound 只会让您“原始”访问嵌入到 WAV 文件中的声音数据,例如 8 位未签名 PCM 或 16 位签名 PCM 数据(如果您的 WAV 文件是 PCM 编码的)。无论哪种情况,每个样本的值都在 0 到 255 或 -32768 到 32767 的范围内,您只需移动范围以适应 -1f 到 1f 即可。
您应该使用适当的源(文件、InputStream 或 URL)从
AudioSystem.getAudioInputStream(...)
开始,检查格式以检查样本大小和通道数,然后您可以读取和相应地转换来自 AudioInputStream 的 PCM 编码数据。JavaSound will only give you "raw" access to the sound data embedded in the WAV file, e.g. 8 bit unsigned PCM or 16 bit signed PCM data (if your WAV files are PCM encoded). In either case, the value of each sample is in the range 0 to 255 or -32768 to 32767 and you simply have to shift the range to fit in -1f to 1f.
You should start with
AudioSystem.getAudioInputStream(...)
using an appropriate source (File, InputStream or URL), examine the format to check the sample size and the number of channels and then you can read and convert the PCM encoded data from the AudioInputStream accordingly.找到这个页面:
http://www.jsresources.org/faq_audio.html
特别参见9.4 :如何从字节数组重建样本值?
通过将 java 的输出与 c++ (libsndfile) 和 matlab (wavread) 进行比较,它按预期工作。
有时间我会把代码放在我的github账号上
found this page:
http://www.jsresources.org/faq_audio.html
see in particular 9.4: How can I reconstruct sample values from a byte array?
It works as expected, by comparing java's output with c++ (libsndfile) and matlab (wavread).
I'm going to put the code on m github account when I have time