2010-10-20 22 views
5

¿Alguien sabe cómo utilizar la cancelación de eco acústico incorporada en el dispositivo Android? Se encuentra en algún lugar del silicio y se usa para llamadas con altavoz GSM/CDMA. Realmente nos gustaría aprovecharlo para una aplicación VoIP en lugar de hacer nuestra propia.Uso de la cancelación de eco acústico incorporada de Android

Ben

+0

¿Alguna suerte? Estoy viendo lo mismo ... –

Respuesta

0

He estado en el mismo lugar, portado con éxito Speex AEC para Android y lo utilizó en 2 clientes VoIP para Android diferentes. La mayor parte del eco se cancela cuando está en el altavoz a volumen completo, probado en una variedad de dispositivos. Los documentos oficiales y Google de Speex deberían ser suficientes para que funcione.

+0

hola me puede guiar cómo hacer que funcione. Estoy luchando para cancelar el eco cuando ambos dispositivos están en modo de altavoz. –

+0

hola, usaste el buffer de jitter en tu código nativo –

4

Finalmente pude hacer que la cancelación de eco funcionara en mi procesador Arm5 (WM8650) (Android 2.2). Debajo están los pasos que tomé.

  1. Envolví Speex con JNI y llamé a las rutinas de procesamiento de eco antes de enviar cuadros de PCM al codificador. No se canceló ningún eco, independientemente de la configuración de Speex que probé.

  2. Dado que Speex es muy sensible a la demora entre la reproducción y los fotogramas de eco, implementé una cola y en cola todos los paquetes enviados a AudioTrack. El tamaño de la cola debe ser aproximadamente igual al tamaño del búfer de AudioTrack interno. De esta forma, el paquete se envió a echo_playback aproximadamente en el momento en que AudioTrack envía paquetes a la tarjeta de sonido desde su búfer interno. El retraso se eliminó con este enfoque pero el eco aún no se canceló

  3. Envolví la parte de cancelación de eco WebRtc con JNI y llamé a sus métodos antes de enviar paquetes al codificador. El eco aún estaba presente, pero la biblioteca, obviamente, estaba tratando de cancelarlo.

  4. Apliqué la técnica de memoria intermedia descrita en P2 y finalmente comenzó a funcionar. Sin embargo, la demora debe ajustarse para cada dispositivo. Tenga en cuenta también que WebRtc tiene una versión móvil y completa de cancelación de eco. La versión completa ralentiza sustancialmente el procesador y probablemente solo se ejecute en ARM7. La versión móvil funciona pero con calidad inferior

Espero que esto ayude a alguien.

+0

Opex ha sido reemplazado por Opus http://opus-codec.org/. –

+0

¿La cola debe ser del mismo tamaño que el búfer interno del AudioTrack MÁS el tamaño del búfer interno del AudioRecord? –

0

Desde API Nivel 11, hay un nuevo valor para MediaRecorder.AudioSource, es VOICE_COMMUNICATION. Android docs say: "Fuente de audio de micrófono sintonizada para comunicaciones de voz como VoIP. Por ejemplo, aprovechará la cancelación de eco o el control automático de ganancia si está disponible. De lo contrario, se comporta como PREDETERMINADO si no se aplica el procesamiento de voz". Intenté esto, pero no pude hacerlo funcionar. El problema puede ser el dispositivo que he usado, que es Sony Tablet S. Aunque vale la pena intentarlo.

+0

Esto es cierto, pero desde API nivel 11, esto realmente no funciona en la mayoría de los dispositivos que he usado hasta ahora. Simplemente lo hace, bueno, nada ... – PKlumpp

Cuestiones relacionadas