Question

Voici ce que je veux faire:

Je veux permettre à l'utilisateur de donner mon programme des données sonores (par une entrée micro), puis maintenez pour 250ms, puis exportez le résultat à travers les haut-parleurs.

Je l'ai fait déjà en utilisant l'API Java Sound. Le problème est qu'il est sorta lent. Il faut un minimum d'environ 1-2 secondes à partir du moment où le son est faite au moment où le son est entendu à nouveau des haut-parleurs, et je l'ai même pas essayé de mettre en œuvre encore la logique de retard. En théorie, il devrait y avoir aucun retard, mais il y a. Je comprends que vous devez attendre la carte son pour remplir son tampon ou autre, et la taille de l'échantillon et le taux d'échantillonnage ont quelque chose à voir avec cela.

Ma question est la suivante: Dois-je continuer sur le chemin de Java en essayant de le faire? Je veux obtenir le délai jusqu'à 100ms comme si possible. Quelqu'un at-il une expérience en utilisant le pilote ASIO avec Java? Soi-disant il est plus rapide ..

De plus, je suis un gars .NET. Est-ce sens pour faire la place avec .NET? Qu'en est-C ++? Je suis à la recherche de la bonne technologie à utiliser ici, et peut-être un bon exemple de la façon de lire / écrire des flux d'entrée / sortie audio à l'aide de votre plate-forme technologique suggérée. Merci pour votre aide!

Était-ce utile?

La solution

Je l'ai utilisé JavaSound dans le passé et l'a trouvé merveilleusement squameuse (et il change constamment entre les versions VM). Si vous aimez C #, l'utiliser, il suffit d'utiliser les API DirectX. Voici un exemple de faire le genre de ce que vous voulez faire en utilisant DirectSound et C #. Vous pouvez utiliser les plug-ins d'effets pour effectuer votre écho de 250 ms.

http://blogs.microsoft.co.il/blogs/tamir/archive/2008/12/25/capturing-and-streaming-sound-by-using-directsound-with-c .aspx

Autres conseils

Vous pouvez regarder dans JACK , une API audio conçu pour le traitement de son faible temps de latence. En outre, Google se présente cette présentation nifty [PDF] sur l'utilisation JACK avec Java .

  

Théoriquement, il devrait y avoir aucun retard, mais il est.

Eh bien, il est impossible d'avoir zéro délai. Le mieux que vous pouvez espérer est un délai imperceptibles (en termes de perception humaine). Il pourrait aider si vous décrire votre algorithme de base pour la lecture et l'écriture des données sonores, afin que les gens peuvent identifier les problèmes possibles.

Un problème potentiel avec l'utilisation d'une langue comme les déchets collectés Java est que le GC fonctionnera périodiquement, interrompre votre traitement pour une certaine quantité de temps arbitraire. Cependant, je serais surpris si c'est> 100 ms en usage normal. Si GC est un problème, la plupart des algorithmes fournissent JVMs de collecte de remplacement, vous pouvez essayer.

Si vous choisissez d'aller sur le C / C ++ chemin, je vous recommande fortement d'utiliser PortAudio ( http://portaudio.com/ ). Il fonctionne avec presque tout sur plusieurs plates-formes et il vous donne un contrôle faible niveau des pilotes audio sans avoir à traiter avec les différentes technologies de pilote son qui est autour.

Je l'ai utilisé PortAudio sur plusieurs projets, et il est un vrai plaisir à utiliser. Et la licence est facultative.

Si une faible latence est votre objectif, vous ne pouvez pas battre C.

libsoundio est une bibliothèque de bas niveau C pour l'entrée audio en temps réel et de sortie. Il vient même avec un qui fait exactement ce que vous voulez -. tuyauterie l'entrée du microphone à la sortie des haut-parleurs

Il est certainement possible avec JavaSound pour obtenir fin à la latence de fin dans le stade de baseball de 100-150ms.

  1. La principale cause de la latence est la taille des tampons des lignes de capture et de lecture. La taille est fixée lors de l'ouverture des lignes:

    • capture: TargetDataLine#open(AudioFormat format, int bufferSize)
    • lecture: SourceDataLine#open(AudioFormat format, int bufferSize)

Si le tampon est trop grande, elle provoquera une latence excessive, mais si elle est trop petit, il provoque la lecture stuttery. Vous avez donc besoin de trouver un équilibre pour vos applications besoins et votre puissance de calcul.

La taille de la mémoire tampon par défaut peut être avec cochée lors de l'appel DataLine#getBufferSize #open(AudioFormat format). La taille par défaut varie en fonction de la et semble AudioFormat être adapté pour une latence élevée, bégayer applications de lecture libre (par exemple streaming internet). Si vous développez une application à faible latence, la taille de la mémoire tampon par défaut est beaucoup trop grand et doit être changé.

Dans mes tests avec une taille de mémoire tampon de 1024 octets a été assez, PCM de 16 <=> peu près idéal pour une faible latence.

  1. La deuxième et la cause souvent négligé de la latence audio est une autre activité se fait dans les filets de capture ou de lecture. Par exemple, la journalisation des messages à la console peut introduire 10 ms de son temps de latence. Désactivez-le.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top