webrtc的音频处理模块分为降噪ns和nsx,回音消除aec,回声控制acem,音频增益agc,静音检测部分。另外webrtc已经封装好了一套音频处理模块APM,若是不是有特殊必要,使用者若是要用到回声消除等较为复杂的模块时,最好使用所有的音频处理模块,不要单独编译其中一部分以避免浪费宝贵的时间。html
可是音频降噪,增益功能较为简单,还能直接使用。这部分源码是我从webrtc中抠出来,单独放到VS2010工程下使用。其中包括重采样以及滤波,降噪功能。这部分是直接复用以前的博文单独使用webrtc降噪功能的代码,也就是说,其实这部分博文只是从以前降噪的基础上扣出了部分声音增益的代码而已。因此关于webrtc的介绍就很少说了,若是有兴趣能够参考以前的博文;git
单独编译和使用webrtc音频降噪模块(附源码+测试demo)web
单独编译和使用webrtc音频回声消除模块(附完整源码+测试音频文件)xcode
由于最近mac电脑不在身边,因此不知道在xcode下可否编译,不过简单看代码应该问题不大。另外测试效果也极为不错,从一首8000采样率的歌曲能够看到,其增益前和增益后的波形以下:post
OK,波形还算比较满意吧?不过实际效果如何,还须要听一下才知道。测试
其实增益使用起来也很简单,简单代码以下:ui
void WebRtcAgcTest(char *filename, char *outfilename,int fs) { FILE *infp = NULL; FILE *outfp = NULL; short *pData = NULL; short *pOutData = NULL; void *agcHandle = NULL; do { WebRtcAgc_Create(&agcHandle); int minLevel = 0; int maxLevel = 255; int agcMode = kAgcModeFixedDigital; WebRtcAgc_Init(agcHandle, minLevel, maxLevel, agcMode, fs); WebRtcAgc_config_t agcConfig; agcConfig.compressionGaindB = 20; agcConfig.limiterEnable = 1; agcConfig.targetLevelDbfs = 3; WebRtcAgc_set_config(agcHandle, agcConfig); infp = fopen(filename,"rb"); int frameSize = 80; pData = (short*)malloc(frameSize*sizeof(short)); pOutData = (short*)malloc(frameSize*sizeof(short)); outfp = fopen(outfilename,"wb"); int len = frameSize*sizeof(short); int micLevelIn = 0; int micLevelOut = 0; while(TRUE) { memset(pData, 0, len); len = fread(pData, 1, len, infp); if (len > 0) { int inMicLevel = micLevelOut; int outMicLevel = 0; uint8_t saturationWarning; int nAgcRet = WebRtcAgc_Process(agcHandle, pData, NULL, frameSize, pOutData,NULL, inMicLevel, &outMicLevel, 0, &saturationWarning); if (nAgcRet != 0) { printf("failed in WebRtcAgc_Process\n"); break; } micLevelIn = outMicLevel; fwrite(pOutData, 1, len, outfp); } else { break; } } } while (0); fclose(infp); fclose(outfp); free(pData); free(pOutData); WebRtcAgc_Free(agcHandle); }
固然,这段代码只是对于8K和16K采样率的音频,若是是32K采样率须要采用滤波分频,而后分别传入最后传出,具体用法和降噪是同样的道理,因此我就再也不单独列出来了。具体用法能够下载本文所附的源码,参考32K采样率音频降噪的使用方法使用。spa
源码下载:WebRtcAudioTest.rarcode