Захват вывода динамика в Java - PullRequest
9 голосов
/ 11 июля 2011

При использовании Java возможно ли захватить выход динамика?Этот вывод генерируется не моей программой, а другими запущенными приложениями.Можно ли это сделать с помощью Java или мне нужно прибегнуть к C / C ++?

Ответы [ 3 ]

6 голосов
/ 11 июля 2011

У меня было приложение на основе Java.который использовал Java Sound , чтобы подключиться к звуку, проходящему через систему, чтобы отследить его.Он хорошо работал на моей собственной (на базе Windows) машине, но на некоторых других не работал.

Было определено, что для того, чтобы заставить его работать на этих машинах, потребовалось бы не что иное, как звуковой шлейф в программном или аппаратном обеспечении (например, подключите провод от гнезда выхода динамика к микрофону).'in' jack).

Так как все, что я действительно хотел сделать, это нарисовать трассировку для музыки, и я понял, как воспроизвести целевой формат (MP3) в Java, то стало ненужным использовать другой вариант в дальнейшем..

(И я также слышал, что Java Sound на Mac. Был ужасно сломан, но я никогда не заглядывал в него.)

3 голосов
/ 11 июля 2011

Java - не лучший инструмент для работы с ОС.Если вам нужно / хотите использовать его для этой задачи, возможно, вы прекратите использовать Java Native Interface (JNI), ссылаясь на библиотеки, скомпилированные на других языках (возможно, c / c ++).

0 голосов
/ 10 июля 2019

Возьмите AUX-кабель , подключите к НАУШНИК ГАРНИТУРА и другой конец к ДЖЕК МИКРОФОНА и выполните этот код

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

}

...