いろいろ音を出せるようになったので録音をしたいと思います。
そもそも録音とは
Javaでできる録音は入力の音源からデータを読み込んでファイルに書き出すことです。どこから読み込むかとどのように書き出すかが重要なポイントです。
Javaではjavax.sound.sampledというパッケージが用意されてこれを利用することで録音が簡単にできるようになります。
書き出し部分
では利用できるものを見ていきます。書き出す部分はjavax.sound.sampled.AudioSystemのwriteメソッドを使います。ここには三つのパラメータが必要です。
- 読み込み元のAudioInputStreamインスタンス
- ファイルタイプのAudioFileFormat.Type
- 書き出す先のFileインスタンス
このうちファイルタイプはenumで通常はAudioFileFormat.Type.WAVEを使ってwav形式にします。書き出す先のFileクラスはよく使われるものでパスを指定してインスタンスをつくれば良いだけです。
問題なのは読み込み元のAudioInputStreamインスタンスです。
AudioInputStreamインスタンスの作成
このインスタンスを作るにはオーディオフォーマットを決める必要があります。以前記事を書いたのでこちらを参照してください。
Javaのオーディオフォーマット
とりあえずCDの音質と同じオーディオフォーマットを作ります。
float SAMPLE_RATE = 44100; int SAMPLE_SIZE_IN_BITS = 16; int CHANNELS = 2; boolean SIGNED = true; boolean BIG_ENDIAN = true; AudioFormat format = new AudioFormat(SAMPLE_RATE, SAMPLE_SIZE_IN_BITS, CHANNELS, SIGNED, BIG_ENDIAN);
フォーマットを指定して元に読み込み元TargetDataLineオブジェクトを取得します。AudioSystemはコンピューター上の指定のフォーマットが使える読み込み元を探してきます。通常はマイク入力になります。
TargetDataLine line = AudioSystem.getTargetDataLine(format);
読み込み元を開きます。データの読み込みを開始します。
line.open(format); line.start();
ここまできてようやくAudioInputStreamのインスタンスを作ることができます。引数に読み込み元のTargetDataLineオブジェクトを指定します。
AudioInputStream ais = new AudioInputStream(line);
書き出しは最初に挙げたAudioSystemのwriteメソッドを使います。この処理は呼ぶと読み込み元を閉じるまでずっと続きます。このためスレッドを別につくり終了処理を工夫する必要があります。
AudioSystem.write(ais, AudioFileFormat.Type.WAVE, new File("recording.wav"));
読み込み元のデータの流れを止めて閉じると書き出しファイルも自動で終了します。
line.stop(); line.close();
処理の流れがわかったところで次回は使えるように実装していきたいと思います。