使用Java是否可以捕获扬声器输出?此输出不是由我的程序生成的,而是由其他正在运行的应用程序生成的。这可以用Java完成还是我需要求助于C / C ++?
答案 0 :(得分:6)
我有一个基于Java的应用程序。使用Java Sound来利用流经系统的声音来追踪它。它在我自己(基于Windows)的机器上运行良好,但在其他一些机器上完全失败。
已经确定,为了让它在这些机器上工作,在软件或硬件中只需要音频环回(例如,将扬声器'输出'的引线连接到''中的麦克风'插孔)。
因为我真正想做的就是绘制音乐的痕迹,并且我想到了如何用Java播放目标格式(MP3),因此没有必要进一步追求其他选项。
(而且我也听说Mac上的Java Sound非常糟糕,但我从未仔细研究过它。)
答案 1 :(得分:3)
在处理操作系统时,Java不是最好的工具。如果您需要/想要将它用于此任务,可能您将结束使用Java Native Interface(JNI),链接到使用其他语言编译的库(可能是c / c ++)。
答案 2 :(得分:0)
用一根 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();
}
}