Erfassen der Lautsprecherausgabe in Java

Lesezeit: 4 Minuten

Benutzer-Avatar
dbotha

Ist es mit Java möglich, die Lautsprecherausgabe zu erfassen? Diese Ausgabe wird nicht von meinem Programm generiert, sondern von anderen laufenden Anwendungen. Geht das mit Java oder muss ich auf C/C++ zurückgreifen?

  • Unabhängig davon, welche Sprache Sie verwenden, müssen Sie zuerst eine Bibliothek finden, die dies für Sie tun kann. Dann geht es nur noch darum, die richtigen Sprachbindungen für diese Bibliothek zu finden/generieren.

    – Casablanca

    10. Juli 2011 um 23:17 Uhr

  • Ich glaube, dass Sie dies nur mit bestimmter Hardware tun können. Ich weiß, dass einige Soundblaster-Live-Karten dies unterstützen, andere grundlegende jedoch nicht (insbesondere die beschisseneren Onboard-Karten).

    – Stefan

    10. Juli 2011 um 23:40 Uhr

  • @casablanca: “Sie müssen zuerst eine Bibliothek finden, die das für Sie tun kann.” Nicht Java. Java verfügt seit Version 1.3 über die Java Sound API. Und wenn Java Sound die Aufgabe nicht erfüllt (siehe meine Antwort), ist dies unwahrscheinlich irgendein (Java-basierte) Bibliothek erfolgreich wäre, da sie logischerweise auf der Java Sound API basieren würde.

    – Andrew Thompson

    10. Juli 2011 um 23:45 Uhr


  • @Andrew Thompson: Ich habe in Anlehnung an JNI angedeutet, da es offensichtlich keinen rein Java-basierten Weg gibt, dies zu tun. Das würde natürlich die Portabilität beeinträchtigen, aber das ist die einzige Möglichkeit, dies in Java zu tun.

    – Casablanca

    14. Juli 2011 um 1:53 Uhr

Benutzer-Avatar
Andreas Thompson

Ich hatte eine Java-basierte App. das Java Sound verwendete, um den durch das System fließenden Ton zu erfassen und eine Spur davon zu machen. Es funktionierte gut auf meinem eigenen (Windows-basierten) Computer, schlug aber auf einigen anderen vollständig fehl.

Es wurde festgestellt, dass, um es auf diesen Maschinen zum Laufen zu bringen, nichts weniger als ein Audio-Loopback in Software oder Hardware erforderlich wäre (z. B. ein Kabel von der Lautsprecher-Ausgangsbuchse zur Mikrofon-Eingangsbuchse verbinden).

Da ich eigentlich nur den Trace für Musik plotten wollte und mir überlegte, wie man das Zielformat (MP3) in Java abspielt, erübrigte sich die weitere Verfolgung der anderen Option.

(Und ich habe auch gehört, dass Java Sound auf dem Mac schrecklich kaputt war, aber ich habe mich nie näher damit befasst.)

Java ist nicht das beste Werkzeug im Umgang mit dem Betriebssystem. Wenn Sie es für diese Aufgabe verwenden müssen/möchten, werden Sie wahrscheinlich die Verwendung von Java Native Interface (JNI) beenden und auf Bibliotheken verlinken, die in anderen Sprachen kompiliert wurden (wahrscheinlich c/c++).

  • Warum ist Java not the best tool when dealing with OS?

    – Logan

    11. Juli 2011 um 4:53 Uhr

  • Da die VM eine Grenze für den Zugriff darstellt und da sie darauf ausgelegt ist, die Kompatibilität zwischen Plattformen zu ermöglichen, geht sie nicht ins Detail: Sie können die Windows-Registrierung nicht bearbeiten oder gemeinsam genutzten Speicher verwenden, Code zur Ausführung auf einer GPU senden. Nicht, dass Sie dies nicht tun könnten, aber Sie müssen eine externe Bibliothek hinzufügen, die mit JNI in einer anderen Sprache geschrieben wurde.

    – SJuan76

    11. Juli 2011 um 9:18 Uhr

  • @SJuan76 you cannot edit Windows registry Ich war überrascht, das falsch zu finden. Siehe hier. but you need to add an external library written in other language using JNI. LWJGL ermöglicht die Ausführung von OpenGL, -CL, AL und anderen auf der GPU ohne JNI/JNA-Aufrufe zu tätigen.

    – Schroff

    11. Januar 2016 um 11:55 Uhr

Nimm ein AUX-Kabelverbunden mit KOPFHÖRERANSCHLUSS und anderes Ende zu MIKROFONANSCHLUSS und diesen Code ausführen

https://www.codejava.net/coding/capture-and-record-sound-in-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();
}

}

1014190cookie-checkErfassen der Lautsprecherausgabe in Java

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy