我在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?
答案 0 :(得分:4)
你在问题中没有提到这个函数的输入是什么,但是我猜测sample
中的元素的范围是-1.0到+1.0。
16位带符号PCM数据的范围为-32768到+32767。所以在这种方法中发生的是每个浮点样本按32767缩放以获得-32767到+32767范围内的值,然后将其截断为short
。
然后,short
首先编写generatedSnd
的低byte[]
,将byte
存储在short
(我假设为{{1}})最低有效8位),然后是高字节(将短8位向右移位取最初的高字节并将其置于低字节)。