1

短い値を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メソッドを調べて、どこが間違っているのか教えていただけませんか。

ありがとう。

4

4 に答える 4

5

getByteFromShort()大丈夫そうです。

getShort(byte argB1, byte argB2)間違っている。argB1が負の場合、誤った結果が生成されます。

そのはず

return (short)((argB1 & 0xff) | (argB2 << 8));
于 2012-05-11T12:39:21.343 に答える
0

次のコードを使用します。

ret[0] = (byte)(x & 0xff);
ret[1] = (byte)((x >> 8) & 0xff);
于 2012-05-11T10:59:00.927 に答える
0

ByteBufferを使用します

ByteBuffer buffer = ByteBuffer.allocate(8*1024);
mRecorder.read(buffer.array(), 0, buffer.capacity());
// using NIO
mRecorder.read(buffer);

while(buffer.remaining() > 1) {
    short s = bb.getShort(x);
    // do something with s
}
于 2012-05-11T11:50:48.713 に答える
0

ByteBufferとjava.nioのそのコホートは、これを支援することができます。基本的に、データを使用して配列に基づくByteBufferを作成しますByteBuffer.wrap(array)。次に、でバッファのエンディアンを設定し、ByteBuffer.order()get / put Int / Short / byte ...などの関数を使用して、基になる配列のデータを操作できます。

于 2012-05-11T11:52:57.850 に答える