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

Java 从MP3文件中获取解码的字节流,java,mp3,jlayer,Java,Mp3,Jlayer,我想对MP3文件进行FFT运算。为此,我想从这个文件格式(我相信它被称为原始PCM数据)中提取解码的字节流。以下是应提取每帧PCM数据的代码: short[] pcmOut = {}; Bitstream bitStream = new Bitstream(new FileInputStream(path_to_mp3_file)); boolean done = false; while (!done) {

我想对MP3文件进行FFT运算。为此,我想从这个文件格式(我相信它被称为原始PCM数据)中提取解码的字节流。以下是应提取每帧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={};
Bitstream Bitstream=新比特流(新文件输入流(路径到mp3文件));
布尔完成=假;
而(!完成){
Header-frameHeader=bitStream.readFrame();
if(frameHeader==null){
完成=正确;
}否则{
解码器=新解码器();
SampleBuffer输出=(SampleBuffer)decoder.decodeFrame(bitStream.readFrame(),bitStream);//返回下一个2304个样本
short[]next=output.getBuffer();
pcmOut=concatarray(pcmOut,下一个);
//用你的样品做什么都行
}
closeFrame();
}
对于(int i=0;i

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

检查这一点似乎与解码器有关;除此之外,每次创建一个新解码器都是一种浪费,这似乎是该实现中的一个基本问题,因为它似乎返回到第一帧,而恒定解码器似乎保持跟踪:

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
  }
解码器=新解码器();
而(!完成){
Header-frameHeader=bitStream.readFrame();
if(frameHeader==null){
完成=正确;
}
否则{
SampleBuffer输出=(SampleBuffer)解码器.decodeFrame(帧头,位流);
short[]next=output.getBuffer();

对于(int i=0;i检查这一点,它似乎与解码器有关;除此之外,每次创建一个新解码器都是一种浪费,这似乎是此实现中的一个基本问题,因为它似乎返回到第一帧,而恒定的解码器似乎保持跟踪:

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
  }
解码器=新解码器();
而(!完成){
Header-frameHeader=bitStream.readFrame();
if(frameHeader==null){
完成=正确;
}
否则{
SampleBuffer输出=(SampleBuffer)解码器.decodeFrame(帧头,位流);
short[]next=output.getBuffer();

对于(int i=0;你是在检查多个帧还是只检查第一个帧?一个帧代表一秒钟的一小部分,因此你可能在检查一个实际声音还没有开始播放的片段…在200帧中检查第199帧的pcmOUT,它是否有非零数据?你是在检查多个帧还是只检查第一个帧?一个帧代表重新发送一秒钟的一小部分,因此您可能正在检查实际声音尚未开始播放的片段…在200帧中检查第199帧的pcmOUT,是否有非零数据?