2016-05-09 10 views
0

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?

+0

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? –

Antwort

2

Dies überprüfen, es scheint mit dem Decoder verwandt zu sein; abgesehen davon, dass es eine Verschwendung einen neuen Decoder jedes Mal zu schaffen, wie es scheint es ein grundsätzliches Problem bei dieser Implementierung ist, wie es auf den ersten Frame zurückzukehren scheint, während ein konstanter Decoder Spur zu halten scheint:

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 
    }