用Java捕获扬声器输出

时间:2011-07-10 23:14:03

标签: java audio capture javasound

使用Java是否可以捕获扬声器输出?此输出不是由我的程序生成的,而是由其他正在运行的应用程序生成的。这可以用Java完成还是我需要求助于C / C ++?

3 个答案:

答案 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();
}

}