2

我在 stackoverflow.com 上找到了一个很好的例子,它实际上适用于播放声音。一切顺利,但我想知道 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 是一个双精度数组,其中包含在这种情况下使用所有必需参数(频率、赫兹等)计算的正弦值,并且 generatedSnd 是一个字节数组。我所知道的只是 val & 0xff 将一个 int 转换为一个字节,但这里究竟做了什么?为什么会有移位>>> 8?

4

1 回答 1

4

你没有在你的问题中提到这个函数的输入是什么,但我猜测其中的元素sample的范围是-1.0到+1.0。

16 位有符号 PCM 数据的范围为 -32768 到 +32767。所以在这个方法中发生的事情是每个浮点样本都按 32767 缩放以获得 -32767 到 +32767 范围内的值,然后将其截断为short.

然后通过首先写入(最低有效 8 位)的低位shortgeneratedSnd然后是高字节(将短 8 位向右移动获取最初的高字节和将其放在低字节中)。byte[]byteshort

于 2013-04-19T12:42:32.120 回答