- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试对某些 PCM 样本应用音量限制。
但是,每当我应用的音量不是 1.0 时,就会产生严重的静电/噪音(有趣的是,仅在声音持续时间的 80% 左右,其余部分似乎在播放时没有失真),并且音量甚至看起来都没有受影响。
就像我说的,如果下面代码中的 soundVolume 为 1.0,效果很好。如果是 0.1-0.9,则会产生可怕的噪音,并且根本不起作用。我不知道为什么。
PCM 样本经过 16 位签名。
// Get samples, apply volume, clamp, write back.
short s1 = (short)((pcmBytes[i] << 8) | (pcmBytes[i + 1]));
s1 = (short)(s1 * soundVolume);
pcmBytes[i] = (byte)((s1 >> 8) & 0xFF);
pcmBytes[i + 1] = (byte)(s1 & 0xFF);
这段代码有问题吗?在 s1 通过算法时追踪它似乎表明它已被正确修改。我是否正确操作了字节?
编辑:即使我正在修改的声音是纯粹的静音,也会发生这种情况。如果 soundVolume 不是 1.0,我会得到静态值。
<小时/>解决方案:新代码,当字节为小端时,我错误地将字节处理为大端。将其与一些缺失的掩码 0xFF 结合起来,这就是解决方案。
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);
最佳答案
仅根据您对问题的描述,我猜测您正在像处理大端数据一样处理小端数据。将 [i] 与 [i+1] 交换即可解决此问题。请注意,如果您的数组与示例流有一个字节不一致,也会发生这种情况。
当您说以下内容时,您的代码也有一个错误:| pcm字节[i+1]字节在这里被转换为 int,如果它是“负”,那么它将用一堆 1 进行符号扩展,这将破坏 pcmBytes[i] 的高位。
结果听起来总是很糟糕,一直,即使你的音量是 1.0。它听起来并不可怕的原因可能还是因为你混淆了字节顺序,所以你实际上只是踩在低位而不是高位上。
因此,当您修复字节顺序时,请务必先将字节与 0xFF 进行 & 操作,然后再将其或操作到示例字中。
关于java - 将音量应用于产生静电/噪音的 PCM 样本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33323760/
还有其他问题and answers在这个站点上建议,要创建回声或延迟效果,您只需添加一个音频样本以及过去存储的音频样本。因此,我有以下 Java 类: public class DelayAMod e
我是一名优秀的程序员,十分优秀!