2010-02-13 30 views
32

Estoy tratando de encontrar la manera de escribir una aplicación que pueda decodificar el código morse de audio sobre la marcha. Encontré this document que explica cómo grabar audio desde el micrófono en Android. Lo que me gustaría saber es si es posible acceder a la entrada sin procesar desde el micrófono o si debe escribirse/leerse en un archivo.Procesamiento de audio en tiempo real en Android

Gracias.

+0

¿Alguna vez has hecho este proyecto Paul? Estoy buscando algo similar a un proyecto de "jonrón" y también me interesaba procesar el audio entrante sobre la marcha ... ¿quizás necesitaría usar una biblioteca nativa para obtener el rendimiento suficiente? déjame un correo electrónico si quieres en andrew en mackenzie-serres.net. ¡Gracias! –

Respuesta

22

Si usa MediaRecorder (el ejemplo anterior), guardará el audio comprimido en un archivo.

Si usa AudioRecord, puede obtener muestras de audio directamente.

Sí, lo que quieres hacer debería ser posible.

-2

Parece que se debe volcar primero en un archivo.

Si echas un vistazo a android.media.AudioRecord source, , los búferes de bytes de datos de audio nativos no están expuestos a la API pública.

En mi experiencia, habiendo construido un sintetizador de audio para Android, es difícil lograr un rendimiento en tiempo real y mantener la fidelidad de audio. Sin embargo, un "traductor" de código Morse es ciertamente factible, y parece un pequeño y divertido proyecto. ¡Buena suerte!

+0

¿Por qué crees que los búferes de audio no se pasan a Java? ¿Qué pasa con el método de lectura()? – dmazzoni

+0

-1 Definitivamente no es necesario volcar primero en un archivo. –

6

El uso de AudioRecord es exagerado. Simplemente marque MediaRecorder.getMaxAmplitude() cada 1000 milisegundos para escuchar ruidos fuertes en lugar de silencio.

Si realmente necesita analizar la forma de onda, entonces sí necesita AudioRecord. Obtenga los datos brutos y calcule algo así como la raíz cuadrática media de la parte de los bytes sin procesar que le interesan para obtener una idea del volumen.

Pero, ¿por qué hacer todo eso cuando MediaRecorder.getMaxAmplitude() es mucho más fácil de usar.

ver mi código de esta respuesta: this question

+0

1000 ms = 1 s, que parece no ser suficiente para analizar el código Morse. – StockB

+2

Pero no puedes usar getMaxAmplitude() (bien puedes, pero siempre obtendrás 0) a menos que realmente comiences a grabar. Por lo tanto, aún tendría que grabar un archivo, que podría crecer infinitamente grande. Definitivamente no es una solución. – matteo

5

existe un marco de detección de los laboratorios de medios del MIT llamado funf: http://code.google.com/p/funf-open-sensing-framework/
Ya clases creadas para la entrada de audio y algunos análisis (FFT y similares), también el ahorro a los archivos o la carga se implementa por lo que he visto, y manejan la mayoría de los sensores disponibles en el teléfono. También puede inspirarse del código que escribieron, que creo que es bastante bueno.

Cuestiones relacionadas