android - 生成声音 - PCM(Android - Java)

标签 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是一个 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/

相关文章:

android - ionic 键盘事件未在 Android 上触发

audio - FFMPEG - 在流 #0 中找不到编解码器 pcm_s16le 的标记,容器中当前不支持编解码器

c - 给定一个音频流,找到关门的时间(声压级计算?)

ios - 在iOS上使用AVComposition混合两个音频文件

android - 如何在 Android 中正确实现 progressBar?

android - 添加我的 FileProvider 时出现问题

java - 使用java无法将int转换为byte

java - 编码和解码 byteValue、intValue、shortValue、hashCode、longValue

android - android 电池放电的剩余时间

arrays - Delphi - 字节数组到字符串