我试图对某些PCM样本应用音量限制。
然而,无论何时我应用的音量都是1.0,但产生的静音/噪音很大(有趣的是只有声音持续时间的80%左右,其余部分似乎没有失真)并且音量不大甚至看起来都受到了影响。
就像我说的,如果soundVolume在下面的代码中是1.0,那么效果很好。如果它是0.1-0.9,它会产生可怕的噪音并且根本不起作用。我不知道为什么会这样做。
PCM样本以16位签名。
short s1 = (short)(((pcmBytes[i + 1] & 0xFF) << 8) | (pcmBytes[i] & 0xFF));
s1 = (short)(s1 * soundVolume);
pcmBytes[i + 1] = (byte)((s1 >> 8) & 0xFF);
pcmBytes[i] = (byte)(s1 & 0xFF);
这段代码有问题吗?在通过算法时追踪s1似乎表明它被正确修改。我是否正确操作字节?
编辑:即使我修改的声音是纯静音,也会发生这种情况。如果soundVolume不是1.0,我会得到静态。
解决方案:新代码,当它们是little-endian时,我错误地将字节处理为big-endian。结合一些缺少掩码0xFF,这就是解决方案。
/// <summary>
/// throws <exception cref="MyException">MyException</exception>
/// </summary>
答案 0 :(得分:2)
仅从您对问题的描述中,我猜您正在处理小端数据,就好像它是大端数据一样。用[i + 1] s交换[i] s可以解决这个问题。请注意,如果您的数组与样本流不对齐,则会发生这种情况。
当你说:你的代码也有一个错误: | pcmBytes [I + 1] 这里的字节转换为int,如果它是“负”,那么它将用一串1来进行符号扩展,这些1将踩踏pcmBytes [i]的高位。
结果听起来很糟糕,即使你的音量是1.0。它听起来不太可怕的原因可能是因为你把字节顺序混淆了,所以你真的只是在低位而不是高位上踩踏。
因此,当您修复字节顺序时,请确保&amp;在将其插入样本字之前使用0xFF的字节。