http://nalab.mind.meiji.ac.jp/~mk/program/sound/DumpWave.java
要点は
AudioInputStream ais = AudioSystem.getAudioInputStream(new File("sound.wav")); byte [] data = new byte [ais.available()]; ais.read(data); ais.close(); |
(クラス・ライブラリィが使えるので、 readwave.c のような低レベルのことはする必要がない。)
以上はデータを一気に読む場合だが、 バイトずつ読んだり、 適当なサイズずつ読んだりする read() メソッドもある (ネットで検索すると簡単に見つかる)。
1 /* 2 * DumpWave.java 3 */ 4 5 import java.io.IOException; 6 import java.io.File; 7 import javax.sound.sampled.*; 8 9 public class DumpWave { 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 System.out.println("#channels: " + af.getChannels()); 21 System.out.println("#isBigEndian: " + af.isBigEndian()); 22 System.out.println("#FrameSize: " + af.getFrameSize()); 23 System.out.println("#SampleSizeInBits: " + af.getSampleSizeInBits()); 24 System.out.println("#SampleRate: " + af.getSampleRate()); 25 if (af.getEncoding() == AudioFormat.Encoding.PCM_SIGNED) { 26 System.out.println("#符号付PCM"); 27 } 28 else if (af.getEncoding() == AudioFormat.Encoding.PCM_UNSIGNED) { 29 System.out.println("#符号無PCM"); 30 } 31 System.out.println("#サイズ: " + data.length + "バイト, " 32 + data.length / af.getSampleRate() + "秒"); 33 // ステレオ,16ビット,符号付PCM,リトルエンディアンのみ 34 if (af.getChannels() == 2 && 35 af.getSampleSizeInBits() == 16 && 36 af.getEncoding() == AudioFormat.Encoding.PCM_SIGNED && 37 (!af.isBigEndian())) { 38 short left, right; 39 for (int i = 0; i < data.length; i += 4) { 40 left = (short)(data[i] & 0xff | (data[i+1] << 8)); 41 right = (short)(data[i+2] & 0xff | (data[i+3] << 8)); 42 System.out.println("" + left + " " + right); 43 } 44 } 45 else { 46 System.out.println("#ステレオ,16ビット,符号付PCM,リトルエンディアンのみ対応"); 47 } 48 } catch (Exception e) { 49 e.printStackTrace(); 50 System.exit(1); 51 } 52 } 53 }
コンパイル&実行 |
mathpc% javac DumpWave.java mathpc% java DumpWave piano.wav #channels: 2 #isBigEndian: false #FrameSize: 4 #SampleSizeInBits: 16 #SampleRate: 44100.0 #符号付PCM #サイズ: 1228068バイト, 27.847347秒 64 64 62 62 65 62 (後略) |