Javaによる録音:外部の音を録音する(1)

スポンサーリンク

録音に必要な技術は前に書いたもので揃いました。実装に入ります。

Javaによる録音:利用できるもののまとめ
Javaでの簡単スレッド利用

外部の音を録音する

Javaで利用できる入力は通常はPCの外部からの入力になります。本体にあるマイクまたはマイク入力端子に外付けマイクが繋がっていればこれをデフォルトで入力元とします。PCの内部でなっている音は工夫が必要なので後々記事を書きます。

ここではスレッドをつかって録音をします。録音を行うメソッドを呼ぶと処理が戻らなくなってしまいます。aisはAudioInputStreamのインスタンスです。

AudioSystem.write(ais, AudioFileFormat.Type.WAVE, newFile(“recording.wav”));

AudioInputStreamのインスタンスはTargetDataLineという入力元を利用しています。

TargetDataLine line = AudioSystem.getTargetDataLine(format);
line.open(format);
line.start();
AudioInputStream ais = new AudioInputStream(line);

この入力元を止めれば別スレッドのwriteメソッドの処理も止まります。

line.stop();

実装

ざっと実装していきます。まずはクラスの定義とコンストラクタです。スレッドの処理を定義をするためRunnableを実装します。コンストラクタでは出力ファイルの情をうを受け取りTargetDataLineを開いています。

public class RecordTest implements Runnable {

  static final long RECORD_TIME = 100;  // 0.1 sec

  File wavFile;

  AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;

  static final float SAMPLE_RATE = 44100;
  static final int SAMPLE_SIZE_IN_BITS = 16;
  static final int CHANNELS = 2;
  static final boolean SIGNED = true;
  static final boolean BIG_ENDIAN = true;
  TargetDataLine line;

  RecordTest(File file) throws Exception {
    AudioFormat format = new AudioFormat(SAMPLE_RATE, SAMPLE_SIZE_IN_BITS, CHANNELS, SIGNED, BIG_ENDIAN);
    wavFile = file;
    line = AudioSystem.getTargetDataLine(format);
    line.open(format);
  }

録音の開始処理です。

void startRecording() {
  try {
    line.start();
    AudioInputStream ais = new AudioInputStream(line);
    AudioSystem.write(ais, fileType, wavFile);
  } catch (IOException ioe) {
    ioe.printStackTrace();
  }
}

録音の終了処理です。

void stopRecording() {
  line.stop();
  line.close();
}

録音の開始処理はスレッドで行い終了処理はメイン処理で行います。このためスレッドの処理は以下のようになります。

@Override
public void run() {
  startRecording();
}

メインの処理は次回にします。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント

  1. 成松 勇 より:

    大変参考になるサイトを作って下さりありがとうございます。
    PCの内部の音を録音したいのですが、期待通りの操作ができません。
    厚かましいお願いと十分承知なのですが、お忙しくなければ、ソースを見ていただきたいのですが、可能でしょうか。

%d人のブロガーが「いいね」をつけました。