如何在Java中读取压缩的.wav音频文件?

时间:2019-02-11 10:45:21

标签: java audio signal-processing bufferedreader wav

我想读取一个从22050Hz降频到8000Hz的音频文件。对于22050Hz,缓冲区大小为512。对于这种方法或任何其他方法来读取Java中经过降采样的.wav文件,是否有解决方案?

使用http://www.labbookpages.co.uk/audio/javaWavFiles.html中的ReadExample类实现了读取音频文件的方法,该类对于22050Hz原始音频正常工作。
当我使用Python的librosa对音频进行降采样并以8000Hz的频率写入文件时,使用ReadExample方法读取该文件时会引发异常-

Error :WavFileException: Compression Code 3 not supported WavFileException: Compression Code 3 not supported

Process finished with exit code -1


代码是-

import java.io.*;

public class ReadExample
{
   public static void main(String[] args)
   {
      try
      {

         WavFile wavFile = WavFile.openWavFile(new File(args[0]); //22050Hz filepath

         wavFile.display();
         int numChannels = wavFile.getNumChannels(); //numChannels = 1

         double[] buffer = new double[512 * numChannels];

         int framesRead;
         double min = Double.MAX_VALUE;
         double max = Double.MIN_VALUE;

         do
         {

            framesRead = wavFile.readFrames(buffer, 512);

            for (int s=0 ; s<framesRead * numChannels ; s++)
            {
               if (buffer[s] > max) max = buffer[s];
               if (buffer[s] < min) min = buffer[s];
            }
         }
         while (framesRead != 0);
         wavFile.close();
         System.out.printf("Min: %f, Max: %f\n", min, max);
      }
      catch (Exception e)
      {
         System.err.println(e);
      }
    }
}

预期结果是照常获取缓冲区中的值。

1 个答案:

答案 0 :(得分:1)

问题是您可能没有使用Java对音频进行下采样。
要么

  

downsample .wav使用Java,然后检查其   工作。   为Java-based downsampling和   this

OR

  

使用第三方库重新采样.wav并进行测试。参考   Re-sample using third-party library