2010-10-20 7 views
5

Qualcuno sa come utilizzare la cancellazione dell'eco acustico integrata del dispositivo Android? Si trova da qualche parte nel silicio e viene utilizzato per le chiamate in vivavoce GSM/CDMA. Ci piacerebbe molto sfruttarlo per un'applicazione VoIP invece di implementare il nostro.Utilizzo della cancellazione acustica di eco incorporata di Android

Ben

+0

Qualche fortuna? Sto guardando la stessa cosa ... –

risposta

0

Sono stato nello stesso posto, portato con successo Speex AEC ad Android e lo ha utilizzato in 2 differenti client VoIP Android. La maggior parte dell'eco viene annullata in viva voce a pieno volume, testata su una varietà di dispositivi. I documenti ufficiali Speex e googling dovrebbero essere sufficienti per farlo funzionare.

+0

ciao mi puoi guidare come farlo funzionare. Sto lottando per cancellare l'eco quando entrambi i dispositivi sono in modalità altoparlante. –

+0

ciao, hai usato il jitter buffer nel tuo codice nativo –

4

Sono finalmente riuscito a ottenere la cancellazione dell'eco per funzionare sul mio processore Arm5 (WM8650) (Android 2.2). Di seguito sono riportati i passaggi che ho preso.

  1. Ho avvolto Speex con JNI e ho chiamato le routine di elaborazione dell'eco prima di inviare i frame PCM all'encoder. Nessuna eco è stata annullata, non importa quali siano le impostazioni di Speex che ho provato.

  2. Poiché Speex è molto sensibile al ritardo tra la riproduzione e le cornici eco, ho implementato una coda e ho messo in coda tutti i pacchetti inviati a AudioTrack. La dimensione della coda dovrebbe essere all'incirca uguale alla dimensione del buffer AudioTrack interno. In questo modo il pacchetto è stato inviato a echo_playback all'incirca nel momento in cui AudioTrack invia i pacchetti alla scheda audio dal suo buffer interno. Il ritardo è stato rimosso con questo approccio ma l'eco non è stato ancora annullato

  3. Ho imbustato la parte di cancellazione dell'eco WebRtc con JNI e ho chiamato i suoi metodi prima di inviare i pacchetti all'encoder. L'eco era ancora presente ma la biblioteca stava ovviamente cercando di cancellarla.

  4. Ho applicato la tecnica del buffer descritta in P2 e finalmente ha iniziato a funzionare. Il ritardo deve essere regolato per ogni dispositivo però. Si noti inoltre che WebRtc ha una versione mobile e completa dell'eliminazione dell'eco. La versione completa rallenta sostanzialmente il processore e probabilmente dovrebbe essere eseguito solo su ARM7. La versione mobile funziona ma con una qualità inferiore

Spero che questo aiuti qualcuno.

+0

Speex è stato sostituito da Opus http://opus-codec.org/. –

+0

La coda deve avere le stesse dimensioni del buffer interno di AudioTrack PIÙ la dimensione del buffer interno di AudioRecord? –

0

Dal livello API 11, c'è un nuovo valore per MediaRecorder.AudioSource, è VOICE_COMMUNICATION. Documenti Android say: "Sorgente audio del microfono ottimizzata per le comunicazioni vocali come il VoIP, che ad esempio sfrutta la cancellazione dell'eco o il controllo automatico del guadagno se disponibile, altrimenti si comporta come DEFAULT se non viene applicata alcuna elaborazione vocale". Ho provato questo, ma non riuscivo a farlo funzionare. Il problema potrebbe essere il dispositivo che avevo usato, che è Sony Tablet S. Vale la pena provare, però.

+0

Questo è vero, ma dal momento che il livello API 11, questo non funziona davvero sulla maggior parte dei dispositivi che ho usato finora. Lo fa, beh, niente .... – PKlumpp