10

Java を使用してスピーカー出力をキャプチャすることは可能ですか? この出力は、私のプログラムではなく、実行中の他のアプリケーションによって生成されています。これは Java で行うことができますか、それとも C/C++ に頼る必要がありますか?

4

3 に答える 3

7

私はJavaベースのアプリを持っていました。Java サウンドを使用して、システムを流れる音を利用してトレースを作成しました。私自身の (Windows ベースの) マシンでは問題なく動作しましたが、他のマシンでは完全に失敗しました。

これらのマシンで動作させるには、ソフトウェアまたはハードウェアのいずれかでオーディオ ループバックが必要であると判断されました (たとえば、スピーカーの「出力」ジャックからマイクの「入力」ジャックにリードを接続します)。

私が本当にやりたかったのは音楽のトレースをプロットすることであり、ターゲット形式 (MP3) を Java で再生する方法を考え出したので、他のオプションをさらに追求する必要がなくなりました。

(また、Mac の Java Sound がひどく壊れているとも聞きましたが、詳しく調べたことはありませんでした。)

于 2011-07-10T23:38:56.043 に答える
3

OS を扱う場合、Java は最適なツールではありません。このタスクに使用する必要がある場合、または使用したい場合は、おそらく Java Native Interface (JNI) の使用を終了し、他の言語 (おそらく c/c++) でコンパイルされたライブラリにリンクします。

于 2011-07-10T23:22:03.263 に答える
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();
}

}

于 2019-07-10T09:28:29.403 に答える