如何解决将WAV音频格式字节数组转换为浮点数
| 我正在使用Java AudioInputStream读取.wav音频文件。音频文件是16位PCM签名的,采样率= 44100,帧大小= 2,帧长=114048。我设法以字节数组的形式获取音频数据,但我我不确定应该为该字节数组分配多少大小,以便可以将其转换为floatinf点值。 我正在使用Goertzel算法进行一些音频操作,该算法需要输入float数组,例如\“ float [] x \”。以下是我正在使用的一些代码片段。提前致谢。 try {
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(fileIn);
}
while ( numBytesRead != -1) {
numBytesRead = audioInputStream.read(audioBytes);
// Logic goes here
floatValue = byteArrayToFloat(audioBytes);
}
解决方法
音频文件是16位PCM签名的,采样率= 44100,帧大小= 2,帧长度= 114048。
从上面的假设,我假设您只有一个通道(2个字节样本* 1个通道= 2个字节帧)。
第一步是将数据获取为16位整数类型的序列,在Java中为
short
。
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.ShortBuffer;
...
byte[] audioBytes = ...
ShortBuffer sbuf =
ByteBuffer.wrap(audioBytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer();
short[] audioShorts = new short[sbuf.capacity()];
sbuf.get(audioShorts);
现在如何将其转换为3s取决于下游功能如何期望音频被表示。例如,如果他们期望浮点数> = -1和<= 1,则可以执行以下操作:
float[] audioFloats = new float[audioShorts.length];
for (int i = 0; i < audioShorts.length; i++) {
audioFloats[i] = ((float)audioShorts[i])/0x8000;
}
不幸的是,有很多方法可以表示音频。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。