很久沒寫文章了,實際上是想記錄一下本身在Android開發的成長曆程。談到音視頻這塊,對於新手來講剛接觸到這一塊,那是很是很是的噁心~我本身弄這一塊也是從頭開始,在 網上也翻閱了無數的資料、瀏覽了無數的博客,嘗試了多種方法,網上大體方法是採用第三方的,如webRtc、speex等。甚至花錢買積分去下demo,也發現了好多demo就是 騙積分的,呵呵~好氣~ 不談了。成長的過程也是比較艱辛的,最後也仍是本身解決了這個問題~~也但願這篇文章能幫助處在當時的個人同樣的狀況下。html
1.Android聲音錄製
1. Android中使用AudioRecord錄製聲音,在Android中錄製聲音須要相應的權限,注意動態申請權限的問題(6.0以上)。
- //處理權限申請回調
- @Override
- public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
- Log.v(TAG, "處理權限申請回調");
- PermissionUtils.requestPermissionsResult(ActivityCameraLiveView.this, requestCode, permissions, grantResults, mPermissionGrant);
- }
- private PermissionUtils.PermissionGrant mPermissionGrant = new PermissionUtils.PermissionGrant() {
- @Override
- public void onPermissionGranted(int requestCode) {
- switch (requestCode) {
- case PermissionUtils.CODE_RECORD_AUDIO:
- Log.v(TAG, "PermissionGrant: CODE_RECORD_AUDIO audio = true");
- audio = true;
- break;
- case PermissionUtils.CODE_READ_EXTERNAL_STORAGE:
- WRITE_EXTERNAL_STORAGE_PERMISSION = true;
- Log.v(TAG, "PermissionGrant: WRITE_EXTERNAL_STORAGE_PERMISSION = true");
- break;
- case PermissionUtils.CODE_STOP_CAMERA:
- Log.v(TAG, "PermissionUtils.CODE_STOP_CAMERA");
- break;
- case PermissionUtils.CODE_WRITE_EXTERNAL_STORAGE:
- break;
- case PermissionUtils.CODE_ACCESS_COARSE_LOCATION:
- break;
- }
- }
- };
- nMinBufSize = AudioRecord.getMinBufferSize(8000,
- AudioFormat.CHANNEL_IN_MONO,
- AudioFormat.ENCODING_PCM_16BIT);
2.Android回聲消除
網上回音消除方式大概有兩種 :1.經過安卓自帶的 VOICE_COMMUNICATION模式進行錄音,自動消除迴音。2.使用第三方庫進行消除(webRtc、Speex..),消除迴音。
用第三方的話,比較麻煩,並且很差實現,用起來效果不是很明顯,試了一下Speex的,感受手機端與手機端語音還能夠,可是若是是手機端(APP)和硬件語音的話,就要考慮到碼流格式的問題,由於咱們公司採用的是G711格式的音頻流,因此就必需要先轉pcm格式而後再轉speex格式,最後轉711格式的。實在不行,還有一種就是在錄音的時候強制關閉揚聲器,在錄音的時候就只錄到手機的聲音隔斷了揚聲器的聲音,不過效果不是很明顯,仍是會有滋滋的噪聲。
關閉揚聲器
- audioManager = (AudioManager) mcontext.getSystemService(Context.AUDIO_SERVICE);
- audioManager.setSpeakerphoneOn(false);
- audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, 0,
- AudioManager.STREAM_VOICE_CALL);
- audioManager.setMode(AudioManager.MODE_IN_CALL);
這裏我推薦第一種方法,不只考慮到了手機機型的適配,還比較簡單就改變一個參數:web
- audioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, 8000,
- AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, nMinBufSize);
- audioRecord.startRecording();
寫到這裏基本上回聲和噪聲就沒有了~ide
http://blog.csdn.net/wl532882877/article/details/78296662?locationNum=5&fps=1this