前回の環境を使って今度は内部の音を録音します。Macでの実装ですがWindowsで内部の音を拾う環境が作れれば同様にできると思います。
ミキサーを取得する
前回の知見をもとに適切なミキサーを取得するメソッドを作ります。”Soundflower (2ch)”という名前でTargetDataLineをサポートするものを取得します。以下は名前を変更出来るようにパラメータで名前を取るようにしています。
public static Mixer getMixer(String name) {
for (Mixer.Info mi : AudioSystem.getMixerInfo()) {
if (!mi.getName().contains(name)) {
continue;
}
Mixer mixer = AudioSystem.getMixer(mi);
if (mixer.isLineSupported(new Line.Info(TargetDataLine.class))) {
return mixer;
}
}
return null;
}
入力元を取得する
あとは外部の録音をした時に取得した入力元の取得方法を変えるようにします。
TargetDataLine line;
Mixer mixer = getMixer("Soundflower (2ch)");
for(Line.Info info:mixer.getTargetLineInfo()){
line = (TargetDataLine)mixer.getLine(info);
break;
}
あとは外部録音と同じように実装すれば内部の音を録音できます。しかし音が小さく聞こえない場合があると思います。次回は音を最大化するツールを作ります。
ソース
以下ソースです。
import javax.sound.sampled.*;
import java.io.*;
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;
Mixer mixer = getMixer("Soundflower (2ch)");
for (Line.Info info : mixer.getTargetLineInfo()) {
line = (TargetDataLine) mixer.getLine(info);
break;
}
//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();
}
public static void main(String[] args) throws Exception {
final RecordTest recorder = new RecordTest(new File("midi/RecordAudio.wav"));
Thread stopper = new Thread(recorder);
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("enter to start recording >>");
in.readLine();
System.out.println("recording...");
stopper.start();
System.out.print("enter to stop recording >>");
in.readLine();
recorder.stopRecording();
System.out.println("finished");
}
@Override
public void run() {
startRecording();
}
public static Mixer getMixer(String name) {
for (Mixer.Info mi : AudioSystem.getMixerInfo()) {
if (!mi.getName().contains(name)) {
continue;
}
Mixer mixer = AudioSystem.getMixer(mi);
if (mixer.isLineSupported(new Line.Info(TargetDataLine.class))) {
return mixer;
}
}
return null;
}
}