将数据从字节数组转换为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();
}
感谢您的关注。
答案 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;
}