我有一个我知道有效的PCM数据文件。我可以播放它,将它编辑成碎片等等,它将始终播放,以及各个部分。
但是当我尝试将其从字节转换为短裤时
bytes[i] | (bytes[i+1] << 8)
该文件为16位,单通道和44100采样。我看不到任何看起来像波形文件的东西。
作为测试,我在消音器中录制,中间有一个非常响亮的声音。当我尝试这个时,我从我的摄入量制作的图表仍然像其他图表一样。我在某种程度上做错了吗?或者误解我正在阅读/尝试的内容?
所有我想做的就是检测一个非常低的阈值来找到一个单词间隙。
由于
答案 0 :(得分:3)
我的精神力量表明这是big-endian vs little-endian事。
如果源文件以big-endian存储样本,这很可能是你想要的:
(bytes[i] << 8) | (bytes[i+1])
对于它的价值,WAV文件是小端的。
其他可能性包括:
我没有看到你的代码,但是你的代码可能只是在每次循环迭代时将i递增1而不是2。 (我在自己的代码中犯了一个常见的错误。)
签名类型或转换。明确如何对有符号和无符号进行位操作。我不确定“bytes”是否是“unsigned char”或“char”的数组。我也不确定“char”是否默认签名或未签名。这可能会更好:
unsigned char b1 = (unsigned char)(bytes[i]);
unsigned char b2 = (unsigned char)(bytes[i+1]);
short sample = (short)((b1 << 8) | (b2));