通过 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 个字节(我的 AudioFormat
:new 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);
根据输出的字节顺序,您可能需要调换顺序。
我对如何使用 Java 的 SourceDataLine.write()
方法中的 byte[]
缓冲区感到有点困惑:在我的程序中,我尝试生成音频数据,我正在通过 SourceDataLine 播放。但是,我正在生成 double
值,并且我对一个样本使用 4 个字节(我的 AudioFormat
:new 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);
根据输出的字节顺序,您可能需要调换顺序。