分类 日常 下的文章

1、编译

支持webrtc-aec

./configure --host=arm-openwrt-linux-muslgnueabi --prefix=$PWD/install --disable-libwebrtc --disable-libyuv --disable-v4l2 --disable-opencore-amrnb --disable-speex-codec --disable-speex-aec --with-openh264=/home/lyz/work/broadcast_app/app/thirds_libs_src/pjproject-2.12.1/third_party/openh264-2.3.1 --enable-libwebrtc-aec3 --with-opus=/home/lyz/work/broadcast_app/app/thirds_libs_src/pjproject-2.12.1/third_party/opus/

支持外部webrtc

./configure --host=arm-openwrt-linux-muslgnueabi --prefix=$PWD/install --enable-libwebrtc --disable-libyuv --disable-v4l2 --disable-opencore-amrnb --disable-speex-codec --disable-speex-aec --with-openh264=/home/lyz/work/broadcast_app/app/thirds_libs_src/pjproject-2.12.1/third_party/openh264-2.3.1 --disable-libwebrtc-aec3 --with-opus=/home/lyz/work/broadcast_app/app/thirds_libs_src/pjproject-2.12.1/third_party/opus/

增加两个方法处理播放和录制;
代码

PJ_DEF(pj_status_t) webrtc_aec_cancel_echo_playback(void *state,

                     pj_int16_t *play_frm ){
webrtc_ec *echo = (webrtc_ec*) state;
unsigned i, j, frm_idx = 0;
int status;
const sample * buf_ptr;
                     
for(i = echo->samples_per_frame / echo->subframe_len; i > 0; i--) {

if PJMEDIA_WEBRTC_AEC_USE_MOBILE

        buf_ptr = &play_frm[frm_idx];

else

        for (j = 0; j < echo->subframe_len; j++) {
            echo->tmp_buf2[j] = play_frm[frm_idx+j];
        }
        buf_ptr = echo->tmp_buf2;

endif

    
    /* Feed farend buffer */
    status = WebRtcAec_BufferFarend(echo->AEC_inst, buf_ptr,
                                        echo->subframe_len);
       frm_idx+= echo->subframe_len;
}
return PJ_SUCCESS;

}
PJ_DEF(pj_status_t) webrtc_aec_cancel_echo_capture(void *state,

                     pj_int16_t *rec_frm,
                     unsigned options ){
webrtc_ec *echo = (webrtc_ec*) state;
int status;
unsigned i, j, frm_idx = 0;
const sample * buf_ptr;
sample * out_buf_ptr;
             
for(i = echo->samples_per_frame / echo->subframe_len; i > 0; i--) {

if PJMEDIA_WEBRTC_AEC_USE_MOBILE

        buf_ptr = &rec_frm[frm_idx];

else

        for (j = 0; j < echo->subframe_len; j++) {
                echo->tmp_buf[j] = rec_frm[frm_idx+j];
            echo->tmp_buf2[j] = NULL;
        }
        buf_ptr = echo->tmp_buf2;

endif

    buf_ptr = echo->tmp_buf;
    out_buf_ptr = echo->tmp_buf2;

if PJMEDIA_WEBRTC_AEC_USE_MOBILE

    status = WebRtcAecm_Process(echo->AEC_inst, &rec_frm[frm_idx],
                                (echo->NS_inst? buf_ptr: NULL),
                                out_buf_ptr, echo->subframe_len,
                                echo->tail);

else

    status = WebRtcAec_Process(echo->AEC_inst, &buf_ptr,
                               echo->channel_count, &out_buf_ptr,
                               echo->subframe_len, (int16_t)echo->tail, 0);

endif

    if (status != 0) {
        print_webrtc_aec_error("Process echo", echo->AEC_inst);
        return PJ_EUNKNOWN;
    }
     for (j = 0; j < echo->subframe_len; j++) {
        rec_frm[frm_idx++] = (pj_int16_t)out_buf_ptr[j];
    }
}
return PJ_SUCCESS;

}

/*

  • WebRTC AEC prototypes
    */

if defined(PJMEDIA_HAS_WEBRTC_AEC) && PJMEDIA_HAS_WEBRTC_AEC!=0

static struct ec_operations webrtc_aec_op =
{

"WebRTC AEC",
&webrtc_aec_create,
&webrtc_aec_destroy,
&webrtc_aec_reset,
&webrtc_aec_cancel_echo,
&webrtc_aec_cancel_echo_playback,
&webrtc_aec_cancel_echo_capture,
&webrtc_aec_get_stat

};

endif

修改头文件:

"pjlib/include/pj/config_site.h"

支持外部webrtc

define PJMEDIA_HAS_WEBRTC_AEC 1

define PJMEDIA_WEBRTC_AEC_USE_MOBILE 1

复制
支持webrtc_aec3

ifdef PJMEDIA_HAS_WEBRTC_AEC3

undef PJMEDIA_HAS_WEBRTC_AEC3

define PJMEDIA_HAS_WEBRTC_AEC3 1

endif

复制
修改default.conf文件配置pjsua_app的启动配置文件支持回声消除:

webrtc echo

--ec-opt=3

webrtc-aec3 echo

--ec-opt=4

--stereo

--ec-tail=75