2016-05-09 14 views
0

MP3ファイルでFFTを実行したい。このために、私はこのファイル形式からデコードされたバイトストリームを抽出したいと思う(私はそれが生のPCMデータと信じていると信じている)。この作業のために、私はjLayer 1.0.1ライブラリを使用している。ここでは、各フレームのためのPCMデータを抽出する必要がありコード:MP3ファイルからデコードされたバイトストリームを取得する

 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ファイルのためにゼロで満たされているということです。このような問題の根本原因は何ですか?

+0

多くのフレームをチェックするか、最初のフレームだけをチェックしますか?フレームは1秒の小さな部分を表しているので、実際のサウンドが再生され始めていないセグメントをチェックしている可能性があります... 200フレームのうち、199フレームのpcmOUTをチェックします。 –

答えて

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 
    } 
関連する問題