【问题标题】:Generate a sound - PCM (Android - Java)生成声音 - PCM (Android - Java)
【发布时间】:2013-04-18 13:29:01
【问题描述】:

我在 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?

【问题讨论】:

  • 只是猜测...它在第一个字节中保存最低 8 位,然后在第二个字节中保存高 8 位(从 9 到 16)?这是正确的吗?那么dVal * 32676是什么意思呢?

标签: android audio byte pcm


【解决方案1】:

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

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

然后将这个short 存储在generatedSnd(我假设是byte[])中,首先写入short 的低位byte(最低有效8 位),然后是高位字节(将短 8 位向右移动,将原来的高字节放在低字节中)。

【讨论】:

  • 你猜对了,样本的元素有你提到的范围。非常感谢您的精彩解释!编辑:generateSnd 是 byte[numSamples*2],正如你所说的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 2013-06-13
  • 2012-04-03
相关资源
最近更新 更多