如何从AudioRecord转换byte []到float []?

时间:2017-10-24 17:39:04

标签: java android arrays byte audiorecord

将数据从字节数组转换为float数组时会遇到问题。在某个操作之后,它必须返回到一个字节数组。

我的应用是录制音频,到目前为止没问题。现在我还要包含过滤器。对于过滤器,我发现每个人都可以使用这个课程:

https://cardinalpeak.com/blog/a-c-class-to-implement-low-pass-high-pass-and-band-pass-filters/

并在stackoverflow上将其转换为java:

Implementing a High Pass filter to an audio signal

我知道过滤器需要浮点值。我使用了我所知道的方法,甚至在stackoverflow上找到,从byte转换为float,从float转换为byte,但没有任何效果。这些是我所知道的方法:

ByteArrayInputStream bufferIN = new ByteArrayInputStream(audioArray);
DataInputStream dataIN = new DataInputStream(bufferIN);
float[] floatAudio = new float[audioArray.length / 4];
for (int i = 0; i < floatAudio.length; i++) {
     floatAudio[i] = dataIN.readFloat();
}


ByteArrayOutputStream bufferOUT = new ByteArrayOutputStream();
DataOutputStream dataOUT = new DataOutputStream(bufferOUT);
for (float i : floatAudio)
     dataOUT.writeFloat(i);
audioArray = bufferOUT.toByteArray();

搜索我发现这个讨论来自AudioRecord的字节必须进行双重操作,因为它们是PCM数据。

How to convert 16-bit PCM audio byte-array to double or float array?

我做到了,但问题是我不知道如何继续,因为在音频中从float转换为字节会产生常规方法的问题。我认为它不是过滤器类的错误,因为在测试时,我将字节转换为浮点数,然后立即按字节浮动,但音频失真。所以我该怎么做?什么是正确的转换,以便我可以处理AudioRecord字段中的字节?

我留下部分代码(我删除了声明,是经典的代码)。注册完成。

byte audioArray[] = new byte[dimBufferAR];

FileOutputStream audioOUT = null;

try {
   audioOUT = new FileOutputStream(pathFile);

   while (REC) {

      AR.read(audioArray, 0, dimBufferAR);

      // Conversion should take place here

      audioOUT.write(audioArray, 0, dimBufferAR);
   }

  audioOUT.close();

}

感谢您的关注。

1 个答案:

答案 0 :(得分:0)

尝试:跳转到每个.readFloat()的下一个4个字节。

float[] floatAudio = new float[audioArray.length / 4];
for (int i = 0; i < floatAudio.length; i=i) 
{
     floatAudio[i] = dataIN.readFloat();
     i += 4;
}