Java を使用してスピーカー出力をキャプチャすることは可能ですか? この出力は、私のプログラムではなく、実行中の他のアプリケーションによって生成されています。これは Java で行うことができますか、それとも C/C++ に頼る必要がありますか?
3 に答える
私はJavaベースのアプリを持っていました。Java サウンドを使用して、システムを流れる音を利用してトレースを作成しました。私自身の (Windows ベースの) マシンでは問題なく動作しましたが、他のマシンでは完全に失敗しました。
これらのマシンで動作させるには、ソフトウェアまたはハードウェアのいずれかでオーディオ ループバックが必要であると判断されました (たとえば、スピーカーの「出力」ジャックからマイクの「入力」ジャックにリードを接続します)。
私が本当にやりたかったのは音楽のトレースをプロットすることであり、ターゲット形式 (MP3) を Java で再生する方法を考え出したので、他のオプションをさらに追求する必要がなくなりました。
(また、Mac の Java Sound がひどく壊れているとも聞きましたが、詳しく調べたことはありませんでした。)
OS を扱う場合、Java は最適なツールではありません。このタスクに使用する必要がある場合、または使用したい場合は、おそらく Java Native Interface (JNI) の使用を終了し、他の言語 (おそらく c/c++) でコンパイルされたライブラリにリンクします。
AUX ケーブルをHEADPHONE JACKに接続し、もう一方の端をMICROPHONE JACKに接続して、このコードを実行します
https://www.codejava.net/coding/capture-and-record-sound-into-wav-file-with-java-sound-api
import javax.sound.sampled.*;
import java.io.*;
public class JavaSoundRecorder {
// record duration, in milliseconds
static final long RECORD_TIME = 60000; // 1 minute
// path of the wav file
File wavFile = new File("E:/Test/RecordAudio.wav");
// format of audio file
AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
// the line from which audio data is captured
TargetDataLine line;
/**
* Defines an audio format
*/
AudioFormat getAudioFormat() {
float sampleRate = 16000;
int sampleSizeInBits = 8;
int channels = 2;
boolean signed = true;
boolean bigEndian = true;
AudioFormat format = new AudioFormat(sampleRate, sampleSizeInBits,
channels, signed, bigEndian);
return format;
}
/**
* Captures the sound and record into a WAV file
*/
void start() {
try {
AudioFormat format = getAudioFormat();
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
// checks if system supports the data line
if (!AudioSystem.isLineSupported(info)) {
System.out.println("Line not supported");
System.exit(0);
}
line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format);
line.start(); // start capturing
System.out.println("Start capturing...");
AudioInputStream ais = new AudioInputStream(line);
System.out.println("Start recording...");
// start recording
AudioSystem.write(ais, fileType, wavFile);
} catch (LineUnavailableException ex) {
ex.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
/**
* Closes the target data line to finish capturing and recording
*/
void finish() {
line.stop();
line.close();
System.out.println("Finished");
}
/**
* Entry to run the program
*/
public static void main(String[] args) {
final JavaSoundRecorder recorder = new JavaSoundRecorder();
// creates a new thread that waits for a specified
// of time before stopping
Thread stopper = new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(RECORD_TIME);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
recorder.finish();
}
});
stopper.start();
// start recording
recorder.start();
}
}