我在 stackoverflow.com 上找到了这里 a great example这实际上适用于播放声音。 一切都很顺利,但我想知道 PCM 生成中发生了什么。 这是代码:
int idx = 0;
for (final double dVal : sample) {
final short val = (short) ((dVal * 32767));
generatedSnd[idx++] = (byte) (val & 0x00ff);
generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
}
其中sample是一个 double 组,它保存使用本例中所有必需参数(频率、赫兹等)计算出的正弦值,generateSnd是一个字节数组。 我所知道的就是 val & 0xff 将 int 转换为 byte,但是这里到底做了什么?为什么会有>>> 8的转变?
最佳答案
您在问题中没有提及此函数的输入是什么,但我猜测 sample
中的元素范围为 -1.0 到 +1.0。
16位有符号PCM数据的范围是-32768到+32767。因此,此方法中发生的情况是,每个浮点样本都按 32767 缩放,以获得 -32767 到 +32767 范围内的值,然后将其截断为 short
.
这个short
然后存储在generatedSnd
中(我假设是 byte[]
)首先写低 byte
short
的(最低有效 8 位),然后是高字节(将短 8 位向右移动,将原来的高字节放在低字节中)。
关于android - 生成声音 - PCM(Android - Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16084316/