短い値をbyte[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;
}
したがって、問題は短い値をbyte[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メソッドを調べて、どこが間違っているのか教えていただけませんか。
ありがとう。