Alle unterstützten Soundformate für Java unter Windows 7?

8

Wir werden, ich habe meinen Kopf gegen eine Wand geschlagen, um Java zu versuchen, ein paar einfache wav-Dateien ohne Glück zu spielen. Ich habe diesen Code ausprobiert:

%Vor%

Dies schlägt bei "clip.open (...)" mit der Ausnahme fehl:

%Vor%

Und ich habe die kompliziertere (Streaming-Version) versucht:

%Vor%

Dies schlägt auch bei "sourceLine.open (...)" mit der Ausnahme fehl:

%Vor%

Ich habe zwei verschiedene wav-Dateien ausprobiert, einschließlich des ehrwürdigen "tada.wav", das in C: \ Windows \ Media enthalten ist.

Ich habe auch GoldWave verwendet, um eine der Dateien in unsigned 8 bit mono zu ändern, aber das änderte nur die Fehlermeldung zu:

%Vor%

Irgendwelche Gedanken darüber, wo ich vielleicht falsch liege? Scheint so, als ob das Spielen einer einfachen Wave-Datei einfach sein sollte, also vermute ich, dass ich irgendwo im Unkraut davongekommen bin.

Vielen Dank im Voraus.

AKTUALISIEREN

Also, die Handlung verdichtet sich. Der Code funktioniert gut, wenn wir ihn in ein separates Java-Programm verschieben. Etwas in unserer Anwendung muss die Fähigkeit des Javas kochen, Töne zu spielen.

Hier ist der Stack-Trace für die obigen Fehler:

%Vor%

UPDATE 2

Weitere interessante Funde. Es scheint, dass wir einen Konflikt haben, wenn wir DLLs laden. Wir haben unsere eigene DLL, die uns hilft, Dinge zu tun (zum Beispiel eine zuverlässige und verwendbare MAC-Adresse zu finden). Wenn Sie einen Sound abspielen (der die Sound-DLLs lädt), bevor Sie unsere DLL laden, funktionieren beide. Wenn Sie jedoch unsere DLL versuchen und dann versuchen, einen Sound abzuspielen, gibt der Sound Ihnen die oben genannten Fehler.

Jeder weiß, warum eine scheinbar nicht verwandte DLL dazu führen würde, dass eine andere DLL später falsch geladen wird?

Als Einstieg für wirklich lahme und schlechte Workarounds können wir beim Start einen Bruchteil einer Sekunde Stille spielen, bevor wir die MAC-Adresse nachschlagen. Dies ist aus mehreren Gründen schlecht, einschließlich der Tatsache, dass viele unserer Kunden überhaupt keinen Ton verwenden.

UPDATE 3

Wenn Sie in unsere Bibliothek eintauchen, scheint das Problem durch einen Aufruf von RegisterClassEx (...) verursacht worden zu sein. Wir tun das, damit wir ein eingebettetes IE-Fenster mit unserer HTML-Hilfedatei anzeigen können.

    
Stephen M 06.01.2014, 21:44
quelle

2 Antworten

0

Nachdem wir herausgefunden hatten, dass es ein Problem mit unserem JNI-Code war:

%Vor%

Es war ein Problem, weil wir es an der falschen Stelle in dllMain anriefen (...). Stattdessen haben wir es an den Ort verschoben, an dem es nur einmal aufgerufen wird, bevor es tatsächlich benötigt wird, um einen eingebetteten Browser zu öffnen.

Das hat unser Problem gelöst.

    
Stephen M 08.01.2014, 19:49
quelle
4

Ich habe schon einmal ein ähnliches Problem festgestellt (allerdings nicht in Bezug auf das Laden von DLLs). Javasound funktioniert darunter mit einem oder mehreren Mischern mit jeweils einer oder mehreren Zeilen. Jede dieser Zeilen hat eine Reihe von Formaten, von denen sie sagt, dass sie sie unterstützen , aber das bedeutet nicht, dass sie nicht spontan verbrennen, wenn sie dieses Format zum Spielen bekommen (im Grunde gibt es nichts, was sie davon abhält, zu rühmen) Abspielen von Formaten kann es nicht.)

Wenn Sie AudioSystem.getLine() verwenden, wird es über alle diese Zeilen von allen diesen Mischern iterieren und im Wesentlichen die erste Zeile zurückgeben, die besagt, dass es mit diesem Format umgehen kann. Wenn diese Linie ein großer, fetter Lügner ist, dann sucht sie nicht nach anderen - sie wird einfach mitgehen und den Fehler erzeugen, den Sie sehen.

Nun ist es wichtig, sich daran zu erinnern, dass die Reihenfolge, in der es über diese Zeilen iteriert, absolut willkürlich ist. Alles kann dazu führen, dass sich etwas ändert, einschließlich etwas, das scheinbar irrelevant erscheint, wie das Laden einer DLL. Ich kann hier eine von zwei Möglichkeiten sehen, die DLL stellt irgendwie eine andere Audiozeile zur Verfügung, die das Problem verursacht, oder das Laden der DLL bewirkt nur, dass sich die willkürliche Reihenfolge ändert, und wenn Sie das tun, kommt sie zuerst aus irgendeinem Grund auf die verdächtige Zeile.

Die Problemumgehung ist nicht nett, aber es ist schöner, als einen Sound zu spielen und etwas zu warten. Sie müssen die Zeile im Wesentlichen testen, um zu sehen, ob sie die Wahrheit sagt:

%Vor%

Dieser Weg dauert etwas länger, aber es ist im Wesentlichen eine doppelte Überprüfung - wir durchlaufen jede Datenzeile, und wenn sagt kann das Format abspielen, prüfen wir, ob es wirklich möglich ist - und nur In diesem Fall bestimmen wir, ob es sicher ist.

    
berry120 07.01.2014 01:00
quelle