这是我的代码。我正在将javax.sound.sampled。*用于音频类。
byte[] myAudioByteArray = new byte[]{0, 127, 127, 127, -127, 127};
ByteArrayInputStream bais = new ByteArrayInputStream(myAudioByteArray);
AudioInputStream stream = new AudioInputStream(bais, new AudioFormat(SampleRate.R_44100, 24, 1, true, false), myAudioByteArray.length)
振幅是位深度,那么java如何允许您设置每个样本的位深度? 我将结果文件的位深度设置为24位深度,因此从理论上讲,我应该能够将样本设置为特定深度范围(16,777,216)。 问题是我不知道如何处理输入到ByteArrayInputStream对象中的字节,然后再将它们输入AudioInputStream对象,因为它们是经过签名的。 我以为您可以将字节转换为二进制表示形式,然后将其中的3个组合起来以获得16,777,216范围内的3个字节,但是从我的判断来看,这种理论是错误的。
答案 0 :(得分:1)
我想也许您可以将字节转换为二进制表示形式,然后将其中的3个组合起来得到16777,216范围内的3个字节,但是根据我的判断,这种理论是错误的。
不确定,为什么这对您不起作用。
每个样本都必须进行编码,big endian or little endian。以下是音频处理库jipes中的一些方法,这些方法展示了如何将字节解码为从小端或大端到int
的样本:
private static int byteToIntLittleEndian(final byte[] buf, final int offset, final int bytesPerSample) {
int sample = 0;
for (int byteIndex = 0; byteIndex < bytesPerSample; byteIndex++) {
final int aByte = buf[offset + byteIndex] & 0xff;
sample += aByte << 8 * (byteIndex);
}
return sample;
}
private static int byteToIntBigEndian(final byte[] buf, final int offset, final int bytesPerSample) {
int sample = 0;
for (int byteIndex = 0; byteIndex < bytesPerSample; byteIndex++) {
final int aByte = buf[offset + byteIndex] & 0xff;
sample += aByte << (8 * (bytesPerSample - byteIndex - 1));
}
return sample;
}
一旦将值解码,您仍然必须转换为目标间隔。如果您对2字节格式感兴趣,即位深度为16,则只需执行以下操作:
final int sample = byteToIntLittleEndian(buf, sampleOffset, bytesPerChannel);
final short shortSample = (short)sample;
演员负责溢出。
3个字节会更复杂。您需要首先知道该值范围。请注意,因为您对带符号的值感兴趣,所以它不是[0,2^24]
,而是:
/**
* A constant holding the minimum value a <code>signed24bit</code> can
* have, -2<sup>22</sup>.
*/
private static final int MIN_VALUE_24BIT = -2 << 22;
/**
* A constant holding the maximum value a <code>signed24bit</code> can
* have, 2<sup>22</sup>-1.
*/
private static final int MAX_VALUE_24BIT = -MIN_VALUE_24BIT-1;
然后使用该值将其转换为如下所示的带符号样本值:
final int sample = byteToIntLittleEndian(bud, sampleOffset, bytesPerChannel);
final int threeByteSample = sample > MAX_VALUE_24BIT ? sample + MIN_VALUE_24BIT + MIN_VALUE_24BIT : sample;