通过SourceDataLine.write播放声音 - 如何使用byte [] - 具有double值的Buffer

时间:2016-04-12 15:00:46

标签: java audio buffer javasound

我对如何使用来自Java byte[]的{​​{1}}缓冲区感到有点困惑 - 方法:在我的程序中,我尝试生成我正在播放的音频数据一个SourceDataLine。但是,我正在生成SourceDataLine.write() - 值,我使用4个字节作为一个样本(我的doubleAudioFormat)。

将一个new AudioFormat(8000f, 32, 1, true, true)转换为四个double的最佳方法是什么(/到"播放"双倍)?

[PS:样本大小为32 bis是否适合普通音频播放?]

1 个答案:

答案 0 :(得分:2)

链接的答案详细说明了这一点,但我会回答你的直接问题。首先,我假设您的双精度值在-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);

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