2011-08-03 15 views
1

オーディオファイルからデータのバイトを抽出する次の2つの実装の違いは何ですか?Java:オーディオファイルからバイトを抽出する

ファイルは.wavファイルなので、ヘッダーなどを使わずにデータのみを抽出します。

実現1:

public byte[] extractAudioFromFile(String filePath) { 
    try { 
     // Get an input stream on the byte array 
     // containing the data 
     File file = new File(filePath); 
     final AudioInputStream audioInputStream = AudioSystem 
       .getAudioInputStream(file); 

     byte[] buffer = new byte[4096]; 
     int counter; 
     while ((counter = audioInputStream.read(buffer, 0, buffer.length)) != -1) { 
      if (counter > 0) { 
       byteOut.write(buffer, 0, counter); 
      } 
     } 
     audioInputStream.close(); 
     byteOut.close(); 
    } catch (Exception e) { 
     System.out.println(e); 
     System.exit(0); 
    }// end catch 

    return ((ByteArrayOutputStream) byteOut).toByteArray(); 
} 

実装2:

public byte[] readAudioFileData(String filePath) throws IOException, 
     UnsupportedAudioFileException { 
    final AudioInputStream audioInputStream = AudioSystem 
      .getAudioInputStream(new File(filePath)); 
    AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, byteOut); 
    audioInputStream.close(); 
    byteOut.close(); 

    return ((ByteArrayOutputStream) byteOut).toByteArray(); 
} 

すべての実装がバイトの異なったサイズを返します。 最初のものは、長さが2番目の実装よりも短いbyte[]を返します。

ファイルのスペクトログラムを視覚化するためにデータのバイトを抽出しようとしました。

何か説明があります。

おかげで、

SAMER

+0

Javaは頭字語ではありません。大文字ではありません。同じことを「データ」と同じです。 –

答えて

9

第二IMPLがフルWAVE 'ファイル形式' を書いています。第2バッファー44 bytesは最初のバッファーよりも大きいですか?

[編集:実際にそれをしようとするのに十分な好奇心 - 上記が正しい]

package so_6933920; 

import java.io.ByteArrayOutputStream; 
import java.io.File; 

import javax.sound.sampled.AudioFileFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 

public class AudioFiles { 
    public static void main(String[] args) { 
     String file = "clarinet.wav"; 
     AudioFiles afiles = new AudioFiles(); 
     byte[] data1 = afiles.readAudioFileData(file); 
     byte[] data2 = afiles.readWAVAudioFileData(file); 
     System.out.format("data len: %d\n", data1.length); 
     System.out.format("data len: %d\n", data2.length); 
     System.out.format("diff len: %d\n", data2.length - data1.length); 
    } 
    public byte[] readAudioFileData(final String filePath) { 
     byte[] data = null; 
     try { 
      final ByteArrayOutputStream baout = new ByteArrayOutputStream(); 
      final File file = new File(filePath); 
      final AudioInputStream audioInputStream = AudioSystem 
      .getAudioInputStream(file); 

      byte[] buffer = new byte[4096]; 
      int c; 
      while ((c = audioInputStream.read(buffer, 0, buffer.length)) != -1) { 
       baout.write(buffer, 0, c); 
      } 
      audioInputStream.close(); 
      baout.close(); 
      data = baout.toByteArray(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return data; 
    } 
    public byte[] readWAVAudioFileData(final String filePath){ 
     byte[] data = null; 
     try { 
      final ByteArrayOutputStream baout = new ByteArrayOutputStream(); 
      final AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(filePath)); 

      AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, baout); 
      audioInputStream.close(); 
      baout.close(); 
      data = baout.toByteArray(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return data; 
    } 
} 

私はthis sample WAV fileでこれを試してみました。

結果:

data len: 489708 
data len: 489752 
diff len: 44 

注:私はそれをクリーンアップするためにあなたのスニペットで、いくつかの自由を取りました。

  1. System.exit(0)は明確なノーではありません。
  2. if(counter > 0)は、readメソッドの戻り値が-1でない場合、カウンタは0より大きくなければならないため、実際には必要ありません。
+0

if(counter> 0)が必要でない理由を少し説明できますか?カウンターが実際にゼロであるか0より小さいかはどういう意味ですか? – wayway

+1

@WayWay読み取るデータがなくなると、readメソッドは-1を返します。したがって、counterは0以下になるべきではありません。私はおそらく "読んで"言うべきであるように私の答えをきれいにする必要があります。 :) – alphazero

関連する問題