5.3 拙作 PlayWave.java -- WAVEファイルを読んで音を再生

http://nalab.mind.meiji.ac.jp/~mk/program/sound/PlayWave.java

『JavaでHelloWorldサウンド編』 にサンプル・プログラムがある。 それを参考にして作ったプログラム。


   1 /*
   2  * PlayWave.java --- WAVEファイルの音を再生する
   3  */
   4 
   5 import java.io.IOException;
   6 import java.io.File;
   7 import javax.sound.sampled.*;
   8 
   9 public class PlayWave {
  10     public static void main(String [] args) {
  11         try {
  12             AudioInputStream ais =
  13                 AudioSystem.getAudioInputStream(new File(args[0]));
  14             // オーディオ入力ストリームからデータを読む
  15             byte [] data = new byte [ais.available()];
  16             ais.read(data);
  17             ais.close();
  18             // ファイルのフォーマットを調べる
  19             AudioFormat af = ais.getFormat();
  20             // 再生する
  21             DataLine.Info info = new DataLine.Info(SourceDataLine.class, af);
  22             SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info);
  23             line.open(af);
  24             line.start();
  25             line.write(data, 0, data.length);
  26         } catch (Exception e) {
  27             e.printStackTrace();
  28             System.exit(1);
  29         }
  30     }
  31 }

もしかして、line.drain();line.close(); も必要かな。

コンパイル&実行
 knoppix$ javac PlayWave.java
 knoppix$ java PlayWave piano.wav

なお、Clip として再生する方法もある。見比べると良い。


   1 /*
   2  * PlayWave_another.java --- Clip を使って再生する (参考)
   3 *   データの中身が見えないので卒研的にはあまり意味がないけれど…
   4  */
   5 
   6 import java.io.*;
   7 import javax.sound.sampled.*;
   8 
   9 public class PlayWave_another {
  10     public static void main(String [] args) throws Exception {
  11         AudioInputStream ais =
  12             AudioSystem.getAudioInputStream(new File(args[0]));
  13         Clip clip = (Clip)AudioSystem.getLine(new Line.Info(Clip.class));
  14         try {
  15             clip.open(ais);
  16             clip.loop(0); // 0+1 回再生…それなら clip.start() でもよい
  17             while (clip.isRunning()) {
  18                 Thread.sleep(100);
  19             }
  20         }
  21         finally {
  22             clip.close();
  23             System.exit(0); // 意外にも必要
  24         }
  25     }
  26 }

桂田 祐史
2017-10-09