zoukankan      html  css  js  c++  java
  • 单独编译和使用webrtc音频增益模块(附完整源码+测试音频文件)

    webrtc的音频处理模块分为降噪ns和nsx,回音消除aec,回声控制acem,音频增益agc,静音检测部分。另外webrtc已经封装好了一套音频处理模块APM,如果不是有特殊必要,使用者如果要用到回声消除等较为复杂的模块时,最好使用全部的音频处理模块,不要单独编译其中一部分以免浪费宝贵的时间。

    但是音频降噪,增益功能较为简单,还能直接使用。这部分源码是我从webrtc中抠出来,单独放到VS2010工程下使用。其中包括重采样以及滤波,降噪功能。这部分是直接复用之前的博文单独使用webrtc降噪功能的代码,也就是说,其实这部分博文只是从之前降噪的基础上扣出了部分声音增益的代码而已。所以关于webrtc的介绍就不多说了,如果有兴趣可以参考之前的博文;

    单独编译和使用webrtc音频降噪模块(附源码+测试demo)

    单独编译和使用webrtc音频回声消除模块(附完整源码+测试音频文件)

    因为最近mac电脑不在身边,所以不知道在xcode下能否编译,不过简单看代码应该问题不大。另外测试效果也极为不错,从一首8000采样率的歌曲可以看到,其增益前和增益后的波形如下:

    OK,波形还算比较满意吧?不过实际效果如何,还需要听一下才知道。

    其实增益使用起来也很简单,简单代码如下:

    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
    ");
                        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采样率音频降噪的使用方法使用。

    源码下载:WebRtcAudioTest.rar

  • 相关阅读:
    在ubuntu下关闭笔记本触摸板
    (转载)实用小命令 windows下查看端口占用情况
    (转载)JBoss 4.2.3下部署EJB 3.0碰到的local和remote问题
    Windows下通过xmanager远程桌面控制Linux(转)
    SQL Server 事务日志的问题
    回归
    用友软件工程IT应用研究院
    关于Oracle数据库的死锁(转书摘)
    关于企业级Web2.0的一点想法
    关注Java的开源项目(中文版)
  • 原文地址:https://www.cnblogs.com/mod109/p/5767867.html
Copyright © 2011-2022 走看看