2016-04-17 16 views
0

私はオーディオファイルから100ミリ秒のオーディオフレームを取得したいと思います。私はフレームを取得するために、以下のコードを使用しますが、私はほんの少しの開始フレームでデータを取得します。私は多くのJavaでオーディオファイルの処理を認識していません。私は正しいですか、何かが間違っています。私の悪い英語を申し訳ありません。javaで100ミリ秒のオーディオフレーミング。

public static void main(String[] args) throws UnsupportedAudioFileException, IOException { 
    byte[] audioBytes; 
    File file = new File("3.wav"); 
    AudioInputStream frame; 
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file); 
    AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(file); 
    AudioFormat format = fileFormat.getFormat(); 
    long audioFileLength = file.length(); 
    int frameSize = format.getFrameSize(); 
    double frameRate = format.getFrameRate(); 
    int frameDuration = 10; 
    double frameLength = ( (frameRate * frameSize)/frameDuration); 
    double numOfFrames = (audioFileLength /frameLength); 
    long remaining = audioFileLength; 
    long framesOfAudioToCopy = (long) (format.getFrameRate()/frameDuration); 
    System.out.println(framesOfAudioToCopy); 
    int i = 0; 
    while(remaining > frameLength ) 
    { 
     audioInputStream.skip((long) (i * frameLength)); 
     frame = new AudioInputStream(audioInputStream, format, framesOfAudioToCopy); 
     audioBytes = new byte[frame.available()]; 
     frame.read(audioBytes); 
     System.out.println(Arrays.toString(audioBytes)); 
     i++; 
     remaining = (long) (remaining - frameLength); 
     /* if(remaining < frameLength) 
     { 
      i++; 
      audioInputStream.skip((long) (i * frameLength));    
      frame = new AudioInputStream(audioInputStream, format, framesOfAudioToCopy);   
      audioBytes = new byte[frame.available()]; 
      frame.read(audioBytes);     
     }*/ 
    }   
} 

答えて

0

私はあなたが必要としない余分なものをたくさんしていると思います。ここでは記述しているもの(と思う)んはるかに簡単書き直したものです:

int numBytesIn100Millis = 
    ((int) (format.getFrameRate()/10)) * format.getFrameSize(); 
byte[] buffer = new byte[numBytesIn100Millis]; 

for (;;) { 
    int bytesRead = audioInputStream.read(buffer); 
    if (bytesRead < 0) 
     break; 
    if (bytesRead < buffer.length) 
     // this just fills the end of 'buffer' with 0s 
     // if read() didn't fill the entire array 
     Arrays.fill(buffer, bytesRead, buffer.length, ((byte) 0)); 

    // 'buffer' now has 100ms of audio 
} 

あなたが抱えている問題は、おそらくあなたが読んたびにskipを使用して、新しいAudioInputStreamを作成している方法によるものです:

audioInputStream.skip((long) (i * frameLength)); 
frame = new AudioInputStream(audioInputStream, format, framesOfAudioToCopy); 

にも進出取得するframe原因audioInputStreamから読み取ります。

とにかくそのようなことをする理由はありません。それは複雑で不必要です。

+0

あなたの返事のためにthnaks。それは素晴らしいと完璧に動作します。もう一度あなたに感謝します。 –

+0

ようこそ。これが問題を解決すると思うなら、私の答えを受け入れることを検討することができます。 http://stackoverflow.com/help/someone-answers – Radiodef