JavaでWAVファイルを読む

Java で音声ファイル(WAV フォーマット)を読むには、以下の手順で処理します。

  1. ファイルを AudioInputStream クラスを使って読み込む。
  2. ストリームから AudioFormat をインスタンス化する。
  3. フォーマットから DataLine.Info をインスタンス化する。
  4. データを SourceDataLine に書き込む。

ファイルを AudioInputStream クラスを使って読み込む。


AudioSystem.getAudioInputStream(String fileName) メソッドを呼び、AudioInputStream オブジェクトをインスタンス化します。 得られたストリームから、available()メソッドでバッファの大きさを取得します。これで、バッファにデータを読み込むことができます。

  AudioInputStream stream=AudioSystem.getAudioInputStream(file);    
  byte buf=new byte[MAXBUF];
  int pos=0;
  int n=0;
  while(0<(n=audioInputStream.read(buf,pos,buf.length)))
    {
	pos+=n;
    }

ストリームから AudioFormat をインスタンス化する。


ストリームから stream.getFormat() メソッドを呼び、AudioFormat を取得します。フレームのサイズと長さから、バイト数を取得します。

  AudioFormat format=stream.getFormat();                            
  long nBytesRead=format.getFrameSize()*stream.getFrameLength();

フォーマットから DataLine.Info をインスタンス化する。


フォーマットから、DataLine.Info オブジェクトをインスタンス化します。

  DataLine.Info info=new DataLine.Info(SourceDataLine.class,format); 

データを SourceDataLine に書き込む。


AudioSystem.getLine(DataLine.Info) メソッドを呼び、SourceDataLine オブジェクトをインスタンス化します。

  SourceDataLine line=(SourceDataLine)AudioSystem.getLine(info);     

ラインは、データを書き込む前に open および start メソッドを呼ぶ必要があります。

  line.open(format);           
  line.start();

write(byte[] buffer,int start, int length) メソッドを使用して、データを書き込みます。

  line.write(buf,0,(int)nBytesRead);

書き込んだ後は、drain および close メソッドを呼び出します。

  line.drain();                
  line.close();

サンプルコード


サンプルコードを示します。

playWavFile(String fileName) で音声ファイルを読み出し、再生することができます。

サンプルコードを使用したプログラムをここに示します。

    import javax.sound.sampled.*;
    import java.io.*;

    public void playWavFile(String fileName)
    {
     try
      {
        File file=new File(fileName);
        if(file.exists())
          {
            // Read the sound file using AudioInputStream.
            AudioInputStream stream=AudioSystem.getAudioInputStream(file);
            byte[] buf=new byte[stream.available()];
            stream.read(buf,0,buf.length);

            // Get an AudioFormat object from the stream.
            AudioFormat format=stream.getFormat();
            long nBytesRead=format.getFrameSize()*stream.getFrameLength();

            // Construct a DataLine.Info object from the format.
            DataLine.Info info=new DataLine.Info(SourceDataLine.class,format);
            SourceDataLine line=(SourceDataLine)AudioSystem.getLine(info);

            // Open and start the line.
            line.open(format);
            line.start();

            // Write the data out to the line.
            line.write(buf,0,(int)nBytesRead);

            // Drain and close the line.
            line.drain();
            line.close();
         }
      }catch(Exception e){e.printStackTrace();}
    }

詳しくは、本家のサイトにページがあります。 (Java Sound API)。 なお、AudioClip を使うと音声ファイルがそのまま再生できます。ただし、再生を止めるなどコントロールする機能はついていません。 使い方については、チュートリアルをご覧ください。
inserted by FC2 system