生成声音 - PCM(Android - Java)

时间:2013-04-18 13:29:02

标签: android audio byte pcm

我在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是一个双数组,它包含在这种情况下使用所有必需参数计算的正弦值(频率,赫兹,依此类推等),generatedSnd是一个字节数组。 我所知道的一切都是val& 0xff将一个int转换为一个字节,但这里做了什么呢?为什么有班次>>> 8?

1 个答案:

答案 0 :(得分:4)

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

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

然后,short首先编写generatedSnd的低byte[],将byte存储在short(我假设为{{1}})最低有效8位),然后是高字节(将短8位向右移位取最初的高字节并将其置于低字节)。