我的缓冲区(数组)充满了音频数据,并填充了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;
}
你们人民可以推荐些什么?
最佳答案
基础音频样本实际上是短裤(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版本。
关于audio - 如何反转AudioTrack play(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30809978/