AudioSystem,isAudioLineSupported returns falseJava

Java-Forum
Anonymous
 AudioSystem,isAudioLineSupported returns false

Post by Anonymous »

Ich versuche, Java-Audiocode zu verwenden, der im Jahr 2019 funktionierte. Ich verwende jetzt die Eclipse-IDE mit JavaSE-21 unter Windows 11. Der folgende Code funktioniert nicht:

Code: Select all

    AudioFormat af = makeAudioFormat();
DataLine.Info info = new DataLine.Info(TargetDataLine.class, af);
if (!AudioSystem.isLineSupported(info)) {
System.out.println("Unsupported audio format");
System.out.println(info);
}
Das println gibt diese Informationen aus:

Code: Select all

Unsupported audio format interface
TargetDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, mono, 2 bytes/frame, big-endian
Ich habe Mono/Stereo und Big-Endian/Little-Endian ausprobiert: Sie schlagen alle fehl.
Nachdem ich mir die Oracle-Dokumentation angesehen hatte, habe ich diesen Code ausprobiert:

Code: Select all

    if (AudioSystem.isLineSupported(Port.Info.MICROPHONE)) {
Es schlägt auch mit Port.Info.LINE_IN fehl.
Die Audioeingabe funktioniert definitiv mit Audacity und mit dem C-Programm, das ich ersetzen möchte. Das C-Programm verwendet die Leitungseinstellungen, die ich hier angegeben habe.
In Einstellungen/Datenschutz und Sicherheit/Mikrofon ist „Apps Zugriff auf Ihr Mikrofon erlauben“ aktiviert und ich kann Aufzeichnungen von Audacity und meinem C-Programm über das Mikrofon sehen, aber es gibt keinen Verweis auf Java app.
Wenn ich fortfahre und trotzdem versuche, die TargetDataLine zu verwenden, erhalte ich den folgenden Stack-Trace:

Code: Select all

Exception in thread "AWT-EventQueue-0"  java.lang.IllegalArgumentException: No line matching interface TargetDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, mono, 2 bytes/frame, big-endian is supported.
at java.desktop/javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:423)
at foo.recorder.AudioIn.(AudioIn.java:75)
at foo.recorder.RecorderTab.startRecord(RecorderTab.java:379)
at foo.recorder.RecorderTab$6.buttonPressed(RecorderTab.java:364)
at foo.recorder.NoteClickImage$Listener.onClick(NoteClickImage.java:23)
at foo.recorder.ClickListener.mouseClicked(ClickListener.java:12)
at java.desktop/java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:280)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6624)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3398)
at java.desktop/java.awt.Component.processEvent(Component.java:6386)
at java.desktop/java.awt.Container.processEvent(Container.java:2266)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4996)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4828)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4584)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2780)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4828)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:775)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:98)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:747)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:744)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Ich habe gelesen, dass diese Ausnahme auch durch ein Sicherheitsproblem verursacht werden kann.

Dem Rat von @greg-449 folgend, habe ich Code hinzugefügt, um die verfügbaren Quelldatenzeilen aufzulisten, was Folgendes hervorgebracht hat:

Code: Select all

Mixer: Primary Sound Driver
interface SourceDataLine supporting 8 audio formats, and buffers of at least 32 bytes
PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame
PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame
PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame
PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame
PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
Es listet viele SourceDataLines auf, aber keine TargetDataLines. So wie ich es verstehe, ist eine Quelle (eher unlogisch) eine Ausgabe und ein Ziel eine Eingabe, sodass ich zwischen vielen Ausgabeformaten, aber keinen Eingabeformaten wählen kann. Dies bestätigt meine Ansicht, dass es sich um ein Sicherheitsproblem handelt.

Ich habe diesen Code hinzugefügt, um zu überprüfen, ob ich die Berechtigung zum Aufzeichnen habe:

Code: Select all

    javax.sound.sampled.AudioPermission ap = new javax.sound.sampled.AudioPermission("record");
System.out.println ("audio permission " + ap.toString());

try {
// Check if the current execution context has the permission
AccessController.checkPermission(ap);
System.out.println("Permission is granted. The app can record audio.");
// Proceed with the action
} catch (SecurityException e) {
System.out.println("Permission denied. The app cannot rrecord audio.");
// Handle the lack of permission gracefully
e.printStackTrace();
}
Und das ist das Ergebnis:

Code: Select all

audio permission ("javax.sound.sampled.AudioPermission" "record")
Permission denied. The app cannot rrecord audio.
java.security.AccessControlException: access denied ("javax.sound.sampled.AudioPermission" "record")
at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:488)
at java.base/java.security.AccessController.checkPermission(AccessController.java:1071)
Ich habe versucht, eine app.policy-Datei mit Audiowiedergabe- und Aufnahmeberechtigungen zu erstellen und sie als VM-Parameter in Eclipse hinzugefügt.
  • Der obige Code meldet jetzt, dass ich die Berechtigung zum Aufzeichnen habe
  • Ich erhalte eine Meldung, dass Security Manager veraltet ist
  • Ich erhalte eine Sicherheitsausnahme, wenn ich versuche, eine Datei zu lesen
  • Ich sehe immer noch „Nein“. TargetDataLines, und ich kann keine öffnen.
... und das Problem war ein fehlerhaftes USB-Kabel, sodass mein Audioeingabegerät nicht als TargetDataLine angezeigt wurde. Seltsamerweise wurde auch das eingebaute Mikrofon nicht angezeigt. Mit einem guten Kabel funktioniert es jetzt!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post