如何使用Java判断8位WAV文件是有符号还是无符号的,且不使用javax.sound

6

我需要知道一个8位的".wav"文件是有符号还是无符号PCM格式,只通过读取文件来判断。我不能使用"javax.sound.sampled.*"或AudioSystem类库。


我试图找出Java如何检测WAV文件是PCM_Signed还是PCM_Unsigned。在本地文件“AudioSystem.java”的第1068行。 - joseluisbz
1
前往您之前提出的问题。选择正确、最佳或最有帮助的答案旁边的“勾选标记”。另请参阅常见问题解答。如果您自己解决了问题,可以选择自己的答案。 - Roddy of the Frozen Peas
2个回答

15

8位(或更低)的 WAV 文件始终是无符号的。9位或更高位始终为有符号:

每个样本包含在一个整数 i 中。 i 的大小是包含指定样本大小所需的最小字节数。最不重要的字节首先存储。表示样本幅度的位存储在 i 的最重要位中,其余位设置为零。

例如,如果样本大小(以nBitsPerSample记录)为12位,则每个样本存储在两个字节的整数中。第一个(最不重要的)字节的最不重要的四位设置为零。

各种大小的 PCM 波形样本的数据格式、最大值和最小值如下:

enter image description here

多媒体编程接口和数据规范 1.0 - IBM/Microsoft,1991年8月


“1-8位为无符号,9位及以上为有符号”只是WAV标准中设定的约定,还是由于某种“限制”而规定的呢? - Sreenikethan I
@SreenikethanI 这就是格式的定义。我不确定你所说的“惯例”是什么意思。如果数据是7位,它代表无符号的7位数字。 - endolith
谢谢回复。我所说的“惯例”是指是否只有WAV标准决定了8位(及以下)为无符号,尽管从技术上讲,有符号数字也是可能的? - Sreenikethan I
WAV格式没有任何指示有符号性的方法,因此,不,WAV格式中不可能存在8位有符号数据。如果是8位,则是无符号的。(从阅读格式规范可以清楚地看出,该格式并没有经过仔细的计划,只是在发展过程中随意添加新功能。对于所有位深度来说,它可能都应该是有符号的,但早期的实现忽略了这一区别,现在我们就卡在这里了。) - endolith
好的,这为我澄清了。谢谢 :) - Sreenikethan I

8
在wav文件中,8位采样被存储为无符号字节,范围从0到255。16位采样则以二进制补码的形式被存储为有符号整数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接