Frage

Ich verwende die Javax Sound -API, um ein einfaches Konsolen -Wiedergabeprogramm basierend auf http://www.jsresources.org/examples/audioplayer.html.

Nach einer 24 -Bit -Rampendatei (jedes Beispiel ist das letzte Beispiel plus 1 über den vollen 24 -Bit -Bereich) ist es offensichtlich, dass während der Wiedergabe etwas Unklares passiert. Die aufgezeichnete Ausgabe ist nicht der Inhalt der Datei (ich habe einen digitalen Loopback, um dies zu überprüfen).

Es scheint die Samples auf irgendeine Weise falsch zu interpretieren, dass der linke Kanal so aussieht, als würde er einen gewissen Gewinn angewendet, und der rechte Kanal sieht so aus, als würde er gedämpft.

Ich habe untersucht, ob die PAN- und Balance -Steuerelemente Einstellung benötigen, diese jedoch nicht verfügbar sind und ich die Einstellungen des Windows XP -Soundsystems überprüft habe. Jede andere Form der Wiedergabe dieser Ramp -Datei ist in Ordnung.

Wenn ich den gleichen Test mit einer 16 -Bit -Datei mache, wird sie korrekt ohne Beschädigung des Streams durchgeführt.

Hat jemand eine Idee, warum die Java -Sound -API meinen Audio -Stream ändert?

War es hilfreich?

Lösung

Das Problem bei der Java -Wiedergabe von 24 -Bit -Audio ist tatsächlich mit Microsoft DirectSound und/oder der Windows Java Sound -Implementierung davon. Mit Linux mit Java Sound und ALSA wird 24-Bit-Audio perfekt zurückgegeben (das Aufnehmen der Ausgabe zeigt eine bit-perfekte Übereinstimmung mit der Eingabedatei).

Um zu sehen, warum es in Windows nicht funktioniert, können Sie die unterstützten Audioformate der Ausgangslinie abfragen, auf die Sie in Java wieder spielen möchten (wohin lineInfo ist der Line.Info der Ausgangslinie):

DataLine.Info dataLineInfo = (DataLine.Info) lineInfo;

und dann durch die unterstützten Formate durchlaufen:

for (AudioFormat lineFormat : dataLineInfo.getFormats())

Für Fenster bekomme ich so etwas wie:

Format #1: PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #2: PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #3: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
Format #4: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
Format #5: PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
Format #6: PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
Format #7: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
Format #8: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian

Das hat nicht 24 Bit als unterstütztes Format. Aber in Windows XP ließ ich mich immer noch 24 -Bit -Audio spielen, aber vermutlich von Java / DirectSound verarbeitet und dann bis zu 24 Bit von der Soundcard wieder aufgenommen. Daher ist die Datenausgabe falsch. In Windows 7 habe ich festgestellt, dass es sich nur geweigert hat, 24 -Bit -Audio zu spielen (wahrscheinlich vernünftiger, wenn alles ohnehin auf 16 -Bit fallen wird).

Für Linux (Fedora 17) bekomme ich so etwas wie (mit der gleichen Soundkarte, einem ESI Juli@, auf demselben PC):

Format #1: PCM_SIGNED unknown sample rate, 32 bit, mono, 4 bytes/frame, little-endian
Format #2: PCM_SIGNED unknown sample rate, 32 bit, mono, 4 bytes/frame, big-endian
Format #3: PCM_SIGNED unknown sample rate, 32 bit, stereo, 8 bytes/frame, little-endian
Format #4: PCM_SIGNED unknown sample rate, 32 bit, stereo, 8 bytes/frame, big-endian
Format #5: PCM_SIGNED unknown sample rate, 24 bit, mono, 4 bytes/frame, little-endian
Format #6: PCM_SIGNED unknown sample rate, 24 bit, mono, 4 bytes/frame, big-endian
Format #7: PCM_SIGNED unknown sample rate, 24 bit, stereo, 8 bytes/frame, little-endian
Format #8: PCM_SIGNED unknown sample rate, 24 bit, stereo, 8 bytes/frame, big-endian
Format #9: PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, little-endian
Format #10: PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, big-endian
Format #11: PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, little-endian
Format #12: PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, big-endian
Format #13: PCM_SIGNED unknown sample rate, 20 bit, mono, 3 bytes/frame, little-endian
Format #14: PCM_SIGNED unknown sample rate, 20 bit, mono, 3 bytes/frame, big-endian
Format #15: PCM_SIGNED unknown sample rate, 20 bit, stereo, 6 bytes/frame, little-endian
Format #16: PCM_SIGNED unknown sample rate, 20 bit, stereo, 6 bytes/frame, big-endian
Format #17: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
Format #18: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
Format #19: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
Format #20: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
Format #21: PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #22: PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #23: PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
Format #24: PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame, 

Das hat 24 Bit als unterstütztes Format. Und als solches funktioniert dies wie erwartet und ohne die unerwünschte zusätzliche Verarbeitung.

Es scheint also, dass die 24-Bit-Wiedergabe mit Java Sound funktioniert, vorausgesetzt, die OS-spezifische (und möglicherweise gerätespezifische ein unterstütztes Audioformat. Meine Tests deuten darauf hin, dass Linux (ALSA) dies unterstützt, während Windows (DirectSound) dies nicht tut.

Hoffe das ist für jemanden hilfreich; Ich konnte nichts anderes an diesem Online -Wert finden, weshalb ich eine so alte Frage gepostet habe.

Das Folgende war meine erste Frage, die ich gerade beantwortet habe (ich habe es als Referenz gelassen):


Ich bin mir nicht sicher, ob dies die richtige Prozedur ist, um alte Fragen zu stoßen, aber aus dem Lesen der FAQ sieht es so aus, als würde dies vorgezogen, eine neue zu veröffentlichen. Ich habe dieses Problem bereits an einigen anderen Orten (einschließlich des Oracle Java Sound Forum) gepostet, aber bisher keine Antworten, und diese Frage klingt genauso wie das Problem, das ich habe:

Ich verwende Java Sound, um Audiodateien abzuspielen (im Standard -PCM -Format), aber ich habe festgestellt, dass es nicht korrekt 24 -Bit -Daten abgespielt wird, da die Datenausgabe aus der Soundcard nicht mit der Eingabe aus der Datei übereinstimmt. Es funktioniert für 16 Bit- (und sogar 8 -Bit-) Audiodaten gut, jedoch nicht für 24 -Bit -(und vermutlich 32 Bit, aber ich habe keine echten 32 -Bit -Audio -Dateien zu testen) Dateien. Aus der Ausgabe scheint der Java -Sound eine zusätzliche (und unerwünschte) Verarbeitung der Audiodaten durchzuführen, bevor sie an die Soundkarte weitergegeben werden. Ich kann mit Sicherheit sagen, dass es sich bei Java Sound um dieselbe Test handelt, da ich denselben Test mit ASIO zum Abspielen der Datei ausführe, gibt es kein Problem und die Daten übereinstimmen wie erwartet.

Ein bisschen mehr Informationen zum Setup: - Java Jre Neueste Version (7U7, glaube ich), ausgeführt unter Windows XP SP3. - Sound gespielt mit Audioplayer -Beispiel (wie in der Hauptfrage erwähnt) auf jsresources.org (ich habe zunächst versucht, meinen eigenen Code zu verwenden, wechselte jedoch darauf, falls ich einen Fehler gemacht habe, die Ergebnisse sind bei beiden gleich). - Das Audio wird über die digitale (S/PDIF) OUT auf einer M-Audio-Soundkarte gespielt, die (über ein externes Kabel) direkt angeschlossen ist Aufgenommen (mit Sony Sound Forge). - Die aufgezeichnete Datei wird dann mit der Eingabewellendatei verglichen.

Für den Test werden vier verschiedene Eingangswellendateien verwendet (generiert aus derselben Quelldatei): - 16 Bit, 44,1 kHz; - 16 Bit, 48 kHz; - 24 Bit, 44,1 kHz; - 24 Bit, 48 kHz.

Mithilfe von ASIO zum Rückspiel der Testdateien haben alle vier Dateien die korrekte Ausgabe erstellt (die aufgezeichneten Daten stimmen mit dem Daten -Byte der Eingabewellendatei für Byte überein, nachdem die Startpositionen für die Zeit zwischen dem Drücken von Datensatz und dem Drücken der Play ausgerichtet sind).

Mit Java zum Wiederholungsdateien erzeugen die 16 -Bit -(sowohl 44,1 kHz als auch 48 kHz) die richtige Ausgabe, während die 24 -Bit -(sowohl die 44,1 kHz als auch 48 kHz) dies nicht tun. Nicht nur das, sondern auch die Art und Weise, wie die Ausgabe falsch ist, ist inkonsistent (wenn ich den Test zweimal ausführe, erzeugt er jedes Mal eine andere Ausgabe, von denen keiner der Eingabedatei nahe kommt). Java -Sound spielt also nicht nur die 24 -Bit -Dateien falsch, sondern auch jedes Mal auf andere Weise. Wenn es hilft, kann ich im Vergleich zur Eingabedatei (erwartete Ausgabe) Screenshots der Java -Soundausgabe aufnehmen.

Der einfachste Weg, dies zu reproduzieren, wäre die Verwendung des oben genannten Audioplayer gefangen). Obwohl es nicht falsch genug ist, dass ich einen Unterschied hören kann, besiegt es jedoch den Zweck von Hi-Reales-Audio, wenn die Daten auf unerwartete Weise geändert werden (Sie riskieren, Gewinne durch die Verwendung von 24 Bit über 16 Bit zu verlieren, obwohl ich, obwohl ich es Ich möchte hier nicht wirklich in dieses Argument eingehen).

Um dies als Frage zu formulieren - wie kann ich Java Sound zum richtigen 24 -Bit -Audio korrekt abspielen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top