通过 SourceDataLine.write 播放声音 - 如何使用 byte[]-Buffer with double values

Playing sound through SourceDataLine.write - How to use the byte[]-Buffer with double values

我对如何使用 Java 的 SourceDataLine.write() 方法中的 byte[] 缓冲区感到有点困惑:在我的程序中,我尝试生成音频数据,我正在通过 SourceDataLine 播放。但是,我正在生成 double 值,并且我对一个样本使用 4 个字节(我的 AudioFormatnew AudioFormat(8000f, 32, 1, true, true))。

将一个 double 转换为四个 byte(/ 到 "play" 双精度)的最佳方法是什么?

[PS: 32 的样本大小是否适合正常的音频播放?]

链接的答案对此进行了非常详细的介绍,但我会直接回答您的问题。首先,我假设您的双精度值在 -1.0 到 1.0 的范围内。这通常是设置。要转到 32 位有符号整数,您需要进行缩放,使 1.0 变为 0x7fffffff,-1.0 变为 0x80000001,这可以通过简单的乘法来完成。

int sampleInt = sampleDouble * 0x7fffffff;

接下来您需要将整数拆分为字节:

byte[0] = (byte)((sampleInt >> 24) & 0xff);
byte[1] = (byte)((sampleInt >> 16) & 0xff);
byte[2] = (byte)((sampleInt >> 8)  & 0xff);
byte[3] = (byte)((sampleInt >> 0)  & 0xff);

根据输出的字节顺序,您可能需要调换顺序。