Ale*_*cus 1 java audio bytearray audio-recording
我在尝试将短值转换为字节 [2] 时遇到了一些问题。我正在使用它对某些音频数据缓冲区进行一些转换(将增益应用于缓冲区)。首先,我像这样加载音频缓冲区:
mRecorder.read(buffer, 0, buffer.length);
Run Code Online (Sandbox Code Playgroud)
缓冲区在哪里
private byte[] buffer;
Run Code Online (Sandbox Code Playgroud)
然后,我得到了样本(录音的样本大小为 16 位),如下所示:
short sample = getShort(buffer[i*2], buffer[i*2+1]);
Run Code Online (Sandbox Code Playgroud)
getShort 定义如下:
/*
*
* Converts a byte[2] to a short, in LITTLE_ENDIAN format
*
*/
private short getShort(byte argB1, byte argB2)
{
return (short)(argB1 | (argB2 << 8));
}
Run Code Online (Sandbox Code Playgroud)
然后我对样本应用增益:
sample *= rGain;
Run Code Online (Sandbox Code Playgroud)
在此之后,我尝试从乘法样本中取回字节数组:
byte[] a = getByteFromShort(sample);
Run Code Online (Sandbox Code Playgroud)
但这失败了,因为即使增益为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;
}
Run Code Online (Sandbox Code Playgroud)
所以问题是在将短值转换为字节 [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];
}
}
Run Code Online (Sandbox Code Playgroud)
你们能不能看看 getByteFromShort 方法并告诉我我错在哪里?
谢谢。
getByteFromShort() 似乎还可以。
getShort(byte argB1, byte argB2)是错的。当 argB1 为负时,它会产生错误的结果。
它应该是
return (short)((argB1 & 0xff) | (argB2 << 8));
Run Code Online (Sandbox Code Playgroud)