如何从wav文件中获取PCM数据?

5

我有一个.wav文件。我希望能够获取该音频文件的PCM数据,以便可以获取音频的各个数据块并进行处理。

但是我不知道该如何做。请问有人能告诉我如何操作吗?目前我已经完成了以下步骤:

public class test
{

    static int frameSample;
    static int timeofFrame;
    static int N;
    static int runTimes;
    static int bps;
    static int channels;
    static double times;
    static int bufSize;
    static int frameSize;
    static int frameRate;
    static long length;

    public static void main(String[] args)
    {
        try
        {
            AudioInputStream ais = AudioSystem.getAudioInputStream(new File("music/audio.wav"));
            AudioInputStream a;
            int numBytes = ais.available();
            System.out.println("numbytes: "+numBytes);
            byte[] buffer = new byte[numBytes];
            byte[] buffer1=new byte[numBytes] ;
            int k=0;
            int count=0;
            while(count!=-1){
                count=ais.read(buffer, 0, numBytes);
            }
            long value = 0;

            for (int i = 0; i < buffer.length; i++)
            {
               value = ((long) buffer[i] & 0xffL) << (8 * i);
               System.out.println("value: "+value);
            }
        } catch(Exception e) {

        }
    }
}

你想使用Java还是J来完成这个任务?在你的问题之前,我从未听说过“J”,我猜你指的是Java。 - Andrew Thompson
抱歉,我不是指J语言,我想用Java来完成。再次道歉。 - Pallab
2个回答

6
这可以通过Java Sound API完成。
  • 使用AudioSystem从文件中获取AudioInputStream
  • 查询流以获取AudioFormat
  • 创建适合格式的byte[]。例如,8位单声道是byte[1]。16位立体声是byte[4]
  • byte[]的块读取流,它将逐帧包含声音。
  • 继续进行进一步处理...

1
到目前为止我已经做了这个。这正确吗?我想从字节中收集整数值。代码在问题中。 - Pallab
请为代码块使用一致且逻辑清晰的缩进。请注意,帧是“单个数据块”,因此您的问题已得到解答。您应该提出一个单独的问题,询问如何将帧转换为int(单声道)或一对int(立体声)。 - Andrew Thompson
请问您能告诉我如何将音频文件中的头部与音频数据分离吗?请告诉我,谢谢。 - Pallab
AudioInputStream读取的字节是纯音频数据,不需要忽略其中任何一个。但是,既然您忽略了有关代码格式等方面的建议,为什么我还要继续帮助呢? - Andrew Thompson

0

这里是一个完全可用的示例,使用 javax.sound.sampled 包。如果您需要有关音频格式的详细信息,可以通过 audioInputStream.getFormat() 获取它们,该方法将返回一个 AudioFormat 对象。

public static byte[] getPcmByteArray(String filename) throws UnsupportedAudioFileException, IOException {

    ByteArrayOutputStream baos = new ByteArrayOutputStream(65536);
    File inputFile = new File(filename);
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(inputFile);

    byte[] buffer = new byte[4096];
    int bytesRead;
    while ((bytesRead = audioInputStream.read(buffer)) != -1) {
        baos.write(buffer, 0, bytesRead);
    }

    return baos.toByteArray();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接