Pregunta

Aquí es lo que quiero hacer:

Quiero permitir al usuario dar mi programa algunos datos de sonido (a través de una entrada de micrófono), luego mantenga presionado durante 250 ms, a continuación, salida hacia afuera a través de los altavoces.

Esto lo he hecho ya uso de Java Sound API.El problema es que es sorta lento.Se necesita un mínimo de alrededor de 1-2 segundos desde el momento en que el sonido está hecho a la vez que el sonido se escucha de nuevo de los altavoces, y ni siquiera he tratado de implementar el retraso de la lógica todavía.En teoría no debería haber ningún retraso, pero ahí está.Entiendo que usted tiene que esperar para la tarjeta de sonido para llenar sus buffer o lo que sea, y el tamaño de la muestra y frecuencia de muestreo de tener algo que ver con esto.

Mi pregunta es la siguiente:Debo continuar por la ruta de Java tratando de hacer esto?Quiero conseguir el retardo de abajo a como 100ms si es posible.¿Alguien tiene experiencia con el controlador ASIO con Java?Supuestamente es más rápido..

También, soy un .NET chico.¿Este sentido hacer con .NET en su lugar?¿Qué acerca de C++?Estoy buscando la mejor tecnología a utilizar aquí, y tal vez un buen ejemplo de cómo leer/escribir a la entrada de audio/salida de flujos utilizando su sugirió la tecnología de la plataforma.Gracias por su ayuda!

¿Fue útil?

Solución

He usado JavaSound en el pasado y lo encontré maravillosamente escamosa (y que no deja de cambiar entre versiones VM). Si te gusta C #, lo utiliza, sólo tiene que utilizar las API de DirectX. He aquí un ejemplo de hacer algo de lo que quiere hacer uso de DirectSound y C #. Usted podría utilizar los plugins de efectos para llevar a cabo sus 250 ms de eco.

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

Otros consejos

Es posible que desee ver en JACK , una API de audio diseñado para el procesamiento de sonido de baja latencia. Además, Google convierte a esta presentación ingeniosa [PDF] sobre el uso de JACK con Java .

  

En teoría no debería haber ninguna demora, pero no lo es.

Bueno, es imposible tener retardo cero. Lo mejor que puede esperar es un retardo imperceptible (en términos de la percepción humana). Podría ayudar si usted describe el algoritmo básico para la lectura y escritura de los datos de sonido, por lo que la gente puede identificar posibles problemas.

Un problema potencial con el uso de un lenguaje de recolección de basura como Java es que la GC se ejecutará periódicamente, la interrupción de su procesamiento para una cierta cantidad de tiempo arbitrario. Sin embargo, me sorprendería si es> 100 ms en el uso normal. Si GC es un problema, la mayoría de las JVM proporcionan algoritmos de recolección alternativos que puede probar.

Si decide ir por la C / C ++ camino, Le recomiendo usar PortAudio ( http://portaudio.com/ ). Funciona con casi todo en múltiples plataformas y se le da un control de bajo nivel de los controladores de sonido sin tener que lidiar con los distintos tecnología de controlador de sonido que está alrededor.

He usado PortAudio en múltiples proyectos, y es un verdadero placer de usar. Y la licencia es permisiva.

Si baja latencia es su objetivo, no se puede superar C.

libsoundio es una biblioteca de bajo nivel C para entrada de audio en tiempo real y de salida. Incluso viene con un programa de ejemplo rel="nofollow">

Es sin duda alcanzable con JavaSound para obtener de extremo a extremo de latencia en el estadio de béisbol de 100-150ms.

  1. La causa principal de la latencia es el tamaño del buffer de captura y reproducción de líneas.El tamaño se establece en el momento de la apertura de las líneas:

    • captura: TargetDataLine#open(AudioFormat format, int bufferSize)
    • reproducción: SourceDataLine#open(AudioFormat format, int bufferSize)

Si el búfer es demasiado grande se hará el exceso de latencia, pero si es demasiado pequeño causará stuttery la reproducción.Así que usted necesidad de encontrar un equilibrio para sus necesidades de aplicación y su potencia de cálculo.

El tamaño de búfer predeterminado se puede comprobar con DataLine#getBufferSize cuando se llama a #open(AudioFormat format).El tamaño predeterminado varía según la AudioFormat y parece estar orientados a la alta latencia, tartamudean gratuita la reproducción de las aplicaciones (por ejemplo,la transmisión de internet).Si está desarrollando una baja latencia de la aplicación, el tamaño de búfer predeterminado es demasiado grande y debe ser cambiado.

En mis pruebas con un PCM de 16 bits AudioFormat, un tamaño de búfer de 1024 bytes ha sido bastante cercano a lo ideal para una baja latencia.

  1. La segunda y a menudo pasado por alto la causa de la latencia de audio de cualquier otra actividad que se realiza en la captura o reproducción de los hilos.Por ejemplo, el registro de los mensajes de la consola puede introducir el 10 de ms de latencia.La apague.
scroll top