从MP3文件中获取解码的字节流

时间:2016-05-09 08:16:35

标签: java mp3 jlayer

我想在MP3文件上进行FFT。为此,我想从这种文件格式中提取解码的字节流(我相信它被称为原始PCM数据)。对于这个任务,我使用的是jLayer 1.0.1库。这里应该为每个帧提取PCM数据的代码:

        short[] pcmOut = {};
        Bitstream bitStream = new Bitstream(new FileInputStream(path_to_mp3_file));
        boolean done = false;
        while (!done) {
            Header frameHeader = bitStream.readFrame();
            if (frameHeader == null) {
                done = true;
            } else {
                Decoder decoder = new Decoder();
                SampleBuffer output = (SampleBuffer) decoder.decodeFrame(bitStream.readFrame(), bitStream); //returns the next 2304 samples
                short[] next = output.getBuffer();
                pcmOut = concatArrays(pcmOut, next);
                //do whatever with your samples
            }
            bitStream.closeFrame();
        }
        for (int i = 0; i < pcmOut.length; i++) {
            if (pcmOut[i] != 0) {
                System.out.println(pcmOut[i]);
            }
        }

问题是变量short[] pcmOut仅用于有效的MP3文件的零填充。这种问题的根本原因是什么?

1 个答案:

答案 0 :(得分:2)

检查这个似乎与解码器有关;除此之外,每次看起来这是一个新的解码器是浪费,它似乎是这个实现中的一个基本问题,因为它似乎回到第一帧,而一个恒定的解码器似乎跟踪:

Decoder decoder = new Decoder();
while (!done) {
  Header frameHeader = bitStream.readFrame();
  if (frameHeader == null) {
            done = true;
  }
  else {
     SampleBuffer output = (SampleBuffer) decoder.decodeFrame(frameHeader, bitStream);
            short[] next = output.getBuffer();
            for(int i=0; i<next.length; i++) System.out.print(" "+next[i]);
            pcmOut = concatArrays(pcmOut, next);
            //do whatever with your samples
  }