gpt4 book ai didi

Java - 使用 LITTLE_ENDIAN 从短到字节[2]

转载 作者:行者123 更新时间:2023-12-01 19:04:42 26 4
gpt4 key购买 nike

我在尝试将短值转换为字节[2]时遇到一些问题。我使用它对某些音频数据缓冲区进行一些转换(将增益应用于缓冲区)。首先,我像这样加载音频缓冲区:

mRecorder.read(buffer, 0, buffer.length);

缓冲区在哪里

private byte[] buffer;

然后,我得到了样本(录音采用 16 位样本大小),如下所示:

short sample = getShort(buffer[i*2], buffer[i*2+1]);

getShort 的定义如下:

/* 
*
* Converts a byte[2] to a short, in LITTLE_ENDIAN format
*
*/
private short getShort(byte argB1, byte argB2)
{
return (short)(argB1 | (argB2 << 8));
}

然后我将增益应用于样本:

sample *= rGain;

此后,我尝试从相乘的样本中取回字节数组:

byte[] a = getByteFromShort(sample);

但这失败了,因为即使增益为 1,声音也有很多噪音。

下面是 getByteFromShort 方法的定义:

    private byte[] getByteFromShort(short x){
//variant 1 - noise
byte[] a = new byte[2];
a[0] = (byte)(x & 0xff);
a[1] = (byte)((x >> 8) & 0xff);

//variant 2 - noise and almost broke my ears - very loud
// ByteBuffer buffer = ByteBuffer.allocate(2);
// buffer.putShort(x);
// buffer.flip();

return a;
}

所以问题在于将短值转换为字节[2]时。当增益为1.0时,声音充满噪音。

以下是完整的增益应用方法:

for (int i=0; i<buffer.length/2; i++)
{ // 16bit sample size
short curSample = getShort(buffer[i*2], buffer[i*2+1]);
if(rGain != 1){
//apply gain
curSample *= rGain;
//convert back from short sample that was "gained" to byte data
byte[] a = getByteFromShort(curSample);
//modify buffer to contain the gained sample
buffer[i*2] = a[0];
buffer[i*2 + 1] = a[1];
}

}

你们能看一下 getByteFromShort 方法并告诉我哪里错了吗?

谢谢。

最佳答案

getByteFromShort() 看起来没问题。

getShort(byte argB1, byte argB2) 错误。当 argB1 为负数时,它会产生错误的结果。

应该是

return (short)((argB1 & 0xff) | (argB2 << 8));

关于Java - 使用 LITTLE_ENDIAN 从短到字节[2],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10549997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com