如何反转AudioTrack play()

时间:2015-06-12 18:32:31

标签: audio audiorecord audiotrack

我有充满音频数据的缓冲区(数组),用AudioRecord方法填充。 我希望玩这个逆转。当我试图反转缓冲区时,我只是得到了噪音。

public void startWriteAndPlayProcess (){
    writeAudio();
    playAudio();
}

private void writeAudio(){
     audioTrack.write(reverseArray(audioBuffer), 0, bufferSize);
}

private void playAudio(){
    audioTrack.play();
}

private byte []  reverseArray ( byte array []){
    byte  [] array1 = new byte [array.length];
    for (int i=0; i<array1.length; i++){
        array1[i]= array[array1.length-1-i];
    }
    return array1;
 }

你们可以推荐什么?

1 个答案:

答案 0 :(得分:1)

底层音频样本实际上是一个短路阵列(16位)或整数(24位或32位)。如果您只是反转原始字节数组,那么您将最低有效字节放在顶部,这将使您的信号听起来像噪声。要使其正常工作,您需要首先将字节数组转换为正确类型的数组,然后将其反转,然后将其转换回字节数组。

private void writeAudio()
{
    short[] shortArray = toShortArray(audioBuffer);
    short[] reversedShortArray = reverseArray(shortArray);
    byte[] reversedByteArray = toByteArray(reversedShortArray);
    audioTrack.write(reversedByteArray, 0, bufferSize);
}

private short[] toShortArray(byte[] byteArray)
{
    short[] shortArray = new short[byteArray.length / 2];
    for (int i = 0 ; i < shortArray.length; i)
    {
         shortArray[i] = (short)((short)byteArray[i*2] | (short)(byteArray[i*2 + 1] << 8));
         // alternatively - depending on the endianess of the data:
         // shortArray[i] = (short)((short)byteArray[i*2] << 8 | (short)(byteArray[i*2 + 1]));
    }
    return shortArray;
}

当然你必须改变reverseArray的类型。我将由你来决定如何从短数组返回字节或者编写它们的int版本,如果这是你需要的。