我对如何使用来自Java byte[]
的{{1}}缓冲区感到有点困惑 - 方法:在我的程序中,我尝试生成我正在播放的音频数据一个SourceDataLine。但是,我正在生成SourceDataLine.write()
- 值,我使用4个字节作为一个样本(我的double
:AudioFormat
)。
将一个new AudioFormat(8000f, 32, 1, true, true)
转换为四个double
的最佳方法是什么(/到"播放"双倍)?
[PS:样本大小为32 bis是否适合普通音频播放?]
答案 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);
根据输出的字节顺序,您可能需要更换订单。