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?
Erfassen der Lautsprecherausgabe in Java
dbotha
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();
}
}
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