从 MP3 文件中获取解码后的字节流
Get decoded byte stream from MP3 file
我想对 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 文件填充了零。这种问题的根本原因是什么?
查了一下好像和解码器有关;除此之外,每次创建一个新的解码器都是一种浪费,这似乎是这个实现中的一个基本问题,因为它似乎 return 到第一帧,而一个恒定的解码器似乎保持跟踪:
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
}
我想对 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 文件填充了零。这种问题的根本原因是什么?
查了一下好像和解码器有关;除此之外,每次创建一个新的解码器都是一种浪费,这似乎是这个实现中的一个基本问题,因为它似乎 return 到第一帧,而一个恒定的解码器似乎保持跟踪:
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
}