【问题标题】:Convert wav audio format byte array to floating point将 wav 音频格式字节数组转换为浮点数
【发布时间】:2011-09-08 06:23:09
【问题描述】:

我正在使用 Java AudioInputStream 读取 .wav 音频文件。音频文件是 16 位 PCM 签名的,采样率 = 44100,帧大小 = 2,帧长度 = 114048。我设法以字节的形式获取音频数据数组,但我不确定我应该为这个字节数组分配多少大小,以便我可以将它转换为浮点值。 我正在使用 Goertzel 算法进行一些音频操作,该算法接受浮点数组的输入,例如“float [] x”。下面是我正在使用的一些代码片段。提前致谢。

 try {
 AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(fileIn);
  }

while ( numBytesRead != -1) {
numBytesRead = audioInputStream.read(audioBytes);

// Logic goes here
floatValue = byteArrayToFloat(audioBytes);
}

【问题讨论】:

    标签: java audio floating-point bytearray


    【解决方案1】:

    音频文件是 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);
    

    现在,如何将其转换为 floats 取决于下游函数期望如何表示音频。例如,如果他们期望浮点数 >= -1 和

    float[] audioFloats = new float[audioShorts.length];
    for (int i = 0; i < audioShorts.length; i++) {
        audioFloats[i] = ((float)audioShorts[i])/0x8000;
    }
    

    不幸的是,有很多方法可以表示音频。

    【讨论】:

    • 您的示例代码假设 AudioInputStream 是 little-endian,我是否正确?如果不能依赖这个假设,调用 .getFormat().isBigEndian() 是否安全,如果返回 true,则改为传入 ByteOrder.BIG_ENDIAN?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 2016-08-21
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多