Question

Je suis l'aide de la javax son API pour mettre en oeuvre une console simple lecture du programme, sur la base http://www.jsresources.org/examples/AudioPlayer.html.

Pour l'avoir testé à l'aide d'un 24 bits rampe de fichier (chaque échantillon est le dernier échantillon de plus de 1 sur la totalité des 24 bits de large), il est évident que quelque chose de bizarre qui se passe lors de la lecture.Le rendement enregistré n'est pas le contenu du fichier (j'ai un numérique de bouclage pour le vérifier).

Il semble avoir mal interprété les échantillons d'une certaine façon qui provoque le canal de gauche à ressembler à elle est d'avoir peu de gain appliqué et le canal de droite ressemble, c'est d'être atténuées.

J'ai cherché à savoir si la CASSEROLE et de la BALANCE des contrôles de besoin, mais ce ne sont pas disponible et j'ai vérifié l'audio de windows xp paramètres du système.Toute autre forme de lecture de cette rampe de fichier est très bien.

Si je fais le même test avec un fichier 16 bit il effectue correctement, sans la corruption de la rivière.

Si quelqu'un a une idée de pourquoi le Java API Sound est en train de modifier mon flux audio?

Était-ce utile?

La solution

Le problème avec Java, la lecture audio de 24 bits est fait avec Microsoft DirectSound et/ou de la Windows Java Sound mise en œuvre.L'utilisation de Linux avec Java Sound et ALSA, 24 bits audio est lu parfaitement (l'enregistrement de la sortie montre un peu-match parfait avec le fichier d'entrée).

Pour voir pourquoi il ne fonctionne pas dans Windows, vous pouvez interroger les formats audio pris en charge de la ligne de sortie que vous voulez jouer sur en Java à l'aide d' (où lineInfo est le Line.Info de la ligne de sortie):

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

et puis en parcourant les formats pris en charge:

for (AudioFormat lineFormat : dataLineInfo.getFormats())

Pour Windows j'obtiens quelque chose comme:

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

Qui n'a pas 24 bits comme un format pris en charge.Mais dans Windows XP il encore permettez-moi de jouer audio 24 bits, mais sans doute traitées à 16 bits par Java / DirectSound et puis retour jusqu'à 24 bits par la carte son.C'est pourquoi la sortie des données est incorrect.Dans Windows 7, je l'ai trouvé simplement refusé de jouer audio 24 bits (probablement plus judicieux si tous sa va faire est de déposer de 16 bits de toute façon).

Pour Linux (Fedora 17) je reçois quelque chose comme (avec la même carte son, une ESI Juli@, sur le même 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, 

Qui a de 24 bits comme un format pris en charge.Et comme tel, cela fonctionne comme prévu et sans les indésirables de traitement supplémentaire.

Il semble donc que 24 bits de lecture ne fonctionne pas avec Java Sound, à condition que le système d'exploitation spécifique (et peut-être spécifique à l'appareil, mais je n'ai pas trouvé de variation entre les appareils que j'ai essayé jusqu'à présent) de la mise en œuvre de il répertorie en tant que format audio pris en charge.Mes tests suggère que Linux (ALSA) prend en charge, alors que Windows (DirectSound) ne fonctionne pas.

Espérons que cela est utile à quelqu'un;Je ne pouvais pas trouver autre chose à propos de cette ligne, c'est pourquoi je l'ai posté sur une vieille question.

Ce qui suit a été ma première question, à laquelle j'ai répondu (je l'ai laissé pour la référence):


Je ne suis pas sûr si c'est la bonne procédure à bosse de vieilles questions, mais à partir de la lecture de la FAQ on dirait que c'est préférable de poster un nouveau.J'ai déjà posté ce problème sur un couple d'autres endroits (y compris le Oracle Java Sound le forum), mais sans réponses à ce jour et à cette question sonne exactement le même que le problème que je vais avoir:

Je suis à l'aide de Java Sonore pour la lecture de fichiers audio (standard format PCM) mais j'ai remarqué qu'il n'a pas de lire correctement les 24 bits de données, que les données de sortie de la carte son ne correspond pas à l'entrée à partir du fichier.Il fonctionne très bien pour 16 bits (et même 8 bits) de données audio, mais pas pour les 24 bits (et sans doute en 32 bits, mais je n'ai pas de réel 32 bits fichiers audio en test) des fichiers.À partir de la sortie il semble que Java Sound est en train de faire de l'extra (et indésirables) de traitement de données audio avant de le transmettre à la carte son.Je peux dire avec certitude que c'est Java Sound le faire parce que si je lance le test en utilisant le ASIO pour lire le fichier, puis il n'y a pas de problème et les données des matchs comme prévu.

Un peu plus d'informations sur la configuration:- Java JRE version la plus récente (7u7 je pense), en cours d'exécution sur Windows XP SP3.- Le son joué à l'aide de AudioPlayer exemple (comme mentionné dans la question principale) sur jsresources.org (j'ai d'abord essayé d'utiliser mon propre code, mais opté pour ce dans le cas où j'avais fait une erreur, les résultats sont les mêmes sur les deux).- L'audio est joué sur un M-Audio carte son via la sortie numérique (S/PDIF), qui est directement connecté (via un câble externe) numérique sur un Lynx de la carte son (sur le même PC), où elle est enregistrée (à l'aide de Sony Sound Forge).- Le fichier enregistré est ensuite comparé avec l'entrée de fichier Wave.

Pour le test, quatre entrées différentes Vagues de fichiers sont utilisés (générés à partir du même fichier source):- 16 bits, 44,1 kHz;- 16 bits, 48 kHz;- 24 bits, 44,1 kHz;- 24 bits à 48 kHz.

L'utilisation d'ASIO pour lire les fichiers de test, tous les quatre des fichiers produits à la sortie correcte (les données enregistrées correspond à l'entrée de la Vague de données du fichier en octets, après l'alignement, les positions de départ pour le délai entre la pression sur enregistrer et appuyer sur play).

À l'aide de Java pour lire les fichiers de test, les 16 bits (deux de 44,1 kHz et 48 kHz) produire le bon de sortie, tandis que les 24 bits (les deux de 44,1 kHz et 48 kHz) ne le font pas.Non seulement cela, mais la façon dont la sortie est incorrecte est contradictoire (si je lance le test deux fois, il a produit un résultat différent à chaque fois, ni de ce qui vient près d'égaler le fichier d'entrée).N'est donc pas seulement Java lecture audio 24 bits fichiers à tort, il le fait à tort d'une manière différente à chaque fois.Si cela peut aider, je peux faire des captures d'écran de la Java de sortie du son par rapport au fichier d'entrée (résultat attendu).

La façon la plus facile de reproduire ce serait d'utiliser l'AudioPlayer exemple mentionné ci-dessus, jouer un 24 bits fichier et enregistrer la sortie (si vous avez une carte son, il pourrait être possible d'utiliser sa table de mixage pour acheminer les données de façon appropriée pour lui permettre d'être capturé).Alors que ce n'est pas mal assez que je peux entendre une différence, il n'genre de vaincre le but de hi-resolution audio si les données sont modifiées dans certains manière inattendue (vous risquez de perdre tous les gains provenant de l'aide de 24 bits sur 16 bits, mais je n'ai pas vraiment envie d'entrer dans cette discussion ici).

Donc, pour cette phrase comme une question - comment puis-je obtenir Java Sound pour lire audio 24 bits correctement?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top