Android 音視頻去回聲、降噪(Android音頻采集及回音消除)(轉)


 好久沒寫文章了,其實是想記錄一下自己在Android開發的成長歷程。談到音視頻這塊,對於新手來說剛接觸到這一塊,那是非常非常的惡心~我自己弄這一塊也是從頭開始,在 網上也翻閱了無數的資料、瀏覽了無數的博客,嘗試了多種方法,網上大致方法是采用第三方的,如webRtc、speex等。甚至花錢買積分去下demo,也發現了好多demo就是    騙積分的,呵呵~好氣~ 不談了。成長的過程也是比較艱辛的,最后也還是自己解決了這個問題~~也希望這篇文章能幫助處在當時的我的一樣的情況下微笑

  

   1.Android聲音錄制

          1. Android中使用AudioRecord錄制聲音,在Android中錄制聲音需要相應的權限,注意動態申請權限的問題(6.0以上)。
     
[html]  view plain  copy
 
  1. //處理權限申請回調  
  2.    @Override  
  3.    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {  
  4.        Log.v(TAG, "處理權限申請回調");  
  5.        PermissionUtils.requestPermissionsResult(ActivityCameraLiveView.this, requestCode, permissions, grantResults, mPermissionGrant);  
  6.    }  
  7.   
  8.   
  9.    private PermissionUtils.PermissionGrant mPermissionGrant = new PermissionUtils.PermissionGrant() {  
  10.        @Override  
  11.        public void onPermissionGranted(int requestCode) {  
  12.            switch (requestCode) {  
  13.                case PermissionUtils.CODE_RECORD_AUDIO:  
  14.                    Log.v(TAG, "PermissionGrant: CODE_RECORD_AUDIO audio = true");  
  15.                    audio = true;  
  16.                    break;  
  17.                case PermissionUtils.CODE_READ_EXTERNAL_STORAGE:  
  18.                    WRITE_EXTERNAL_STORAGE_PERMISSION = true;  
  19.                    Log.v(TAG, "PermissionGrant: WRITE_EXTERNAL_STORAGE_PERMISSION = true");  
  20.                    break;  
  21.                case PermissionUtils.CODE_STOP_CAMERA:  
  22.                    Log.v(TAG, "PermissionUtils.CODE_STOP_CAMERA");  
  23.                    break;  
  24.                case PermissionUtils.CODE_WRITE_EXTERNAL_STORAGE:  
  25.                    break;  
  26.                case PermissionUtils.CODE_ACCESS_COARSE_LOCATION:  
  27.                    break;  
  28.            }  
  29.        }  
  30.    };  
      2.對AudioRecord進行錄音前需要對采樣率進行設置
          
[html]  view plain  copy
 
  1. nMinBufSize = AudioRecord.getMinBufferSize(8000,  
  2.                        AudioFormat.CHANNEL_IN_MONO,  
  3.                        AudioFormat.ENCODING_PCM_16BIT);  

    2.Android回聲消除

       網上回音消除方式大概有兩種 :1.通過安卓自帶的 VOICE_COMMUNICATION模式進行錄音,自動消除回音。2.使用第三方庫進行消除(webRtc、Speex..),消除回音。
       用第三方的話,比較麻煩,而且不好實現,用起來效果不是很明顯,試了一下Speex的,感覺手機端與手機端語音還可以,但是如果是手機端(APP)和硬件語音的話,就要考慮到碼流格式的問題,因為我們公司采用的是G711格式的音頻流,所以就必須要先轉pcm格式然后再轉speex格式,最后轉711格式的。實在不行,還有一種就是在錄音的時候強制關閉揚聲器,在錄音的時候就只錄到手機的聲音隔斷了揚聲器的聲音,不過效果不是很明顯,還是會有滋滋的噪聲。
      
   關閉揚聲器
[html]  view plain  copy
 
  1. audioManager = (AudioManager) mcontext.getSystemService(Context.AUDIO_SERVICE);  
  2.                              audioManager.setSpeakerphoneOn(false);  
  3.                              audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, 0,  
  4.                                      AudioManager.STREAM_VOICE_CALL);  
  5.                              audioManager.setMode(AudioManager.MODE_IN_CALL);  
   
 

        這里我推薦第一種方法,不僅考慮到了手機機型的適配,還比較簡單就改變一個參數:

      

[html]  view plain  copy
 
  1. audioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, 8000,  
  2.                    AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, nMinBufSize);  
  3.            audioRecord.startRecording();  

        寫到這里基本上回聲和噪聲就沒有了~

 

 

 

 

 

 

 

 

 

 

 

http://blog.csdn.net/wl532882877/article/details/78296662?locationNum=5&fps=1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM