Ich möchte die FFT auf eine MP3-Datei zu tun. Dazu möchte ich den dekodierten Bytestream aus diesem Dateiformat extrahieren (ich glaube, es heißt die rohen PCM-Daten). Für diese Aufgabe verwende ich die jLayer 1.0.1-Bibliothek. Hier ist der Code, der die PCM-Daten für jeden Frame extrahieren sollte:Get decodierten Byte-Stream von MP3-Datei
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]);
}
}
Das Problem ist, dass die Variable short[] pcmOut
mit den Nullen gefüllt ist nur für eine gültige MP3-Datei. Was ist die Ursache für ein solches Problem?
Sind Sie Überprüfen Sie viele Frames oder nur die erste? Ein Frame stellt einen kleinen Bruchteil einer Sekunde dar, also ist es möglich, ein Segment zu überprüfen, in dem der eigentliche Sound noch nicht begonnen hat zu spielen ... Aus 200 Frames überprüfen Sie das PCMOUT des 199. Frames, hat das nicht-Null Daten? –