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/
2. Модификация кода: добавьте два метода для управления воспроизведением и записью;
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"
3、Поддержка внешнего webrtc
#define PJMEDIA_HAS_WEBRTC_AEC 1 # define PJMEDIA_WEBRTC_AEC_USE_MOBILE 1
4. Измените файл default.conf, чтобы настроить файл конфигурации запуска pjsua_app для поддержки эхоподавления:
#webrtc echo--ec-opt=3#webrtc-aec3 echo
#--ec-opt=4#--stereo--ec-tail=75
5. Как включить webrtc-aec3
./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/app/thirds_libs_src/pjproject-2.12.1/third_party/openh264-2.3.1
--enable-libwebrtc-aec3 --with-opus=/home/ap/thirds_libs_src/pjproject-2.12.1/third_party/opus/
Удалить Third_party\build\os-auto.mak
ifneq (,1)
ifeq (0,1)
# External webrtc AEC3
else
DIRS += webrtc_aec3
WEBRTC_AEC3_OTHER_CFLAGS = -fexceptions -mfpu=neon -mfloat-abi=hard -DWEBRTC_LINUX=1 -DWEBRTC_APM_DEBUG_DUMP=0 -DWEBRTC_POSIX=1
ifneq ($(findstring sse2,sse2),)
# export WEBRTC_AEC3_SRC = \
# common_audio/resampler/sinc_resampler_sse.o \
# common_audio/third_party/ooura/fft_size_128/ooura_fft_sse2.o
# export WEBRTC_AEC3_SRC += \
# common_audio/resampler/sinc_resampler_avx2.o \
# modules/audio_processing/aec3/adaptive_fir_filter_erl_avx2.o \
# modules/audio_processing/aec3/adaptive_fir_filter_avx2.o \
# modules/audio_processing/aec3/fft_data_avx2.o \
# modules/audio_processing/aec3/matched_filter_avx2.o \
# modules/audio_processing/aec3/vector_math_avx2.o \
# modules/audio_processing/agc2/rnn_vad/rnn_vector_math_avx2.o
# WEBRTC_AEC3_OTHER_CFLAGS += -mfma
else ifneq ($(findstring neon,sse2),)
export WEBRTC_AEC3_SRC = \
common_audio/resampler/sinc_resampler_neon.o \
common_audio/third_party/ooura/fft_size_128/ooura_fft_neon.o
WEBRTC_AEC3_OTHER_CFLAGS += -DWEBRTC_HAS_NEON
endif
endif
endif
Параметр Конфигурацияec-3, добавьте webrtc в файл конфигурации запуска. echoиз Конфигурация
#webrtc echo
--ec-opt=4
Эта статья является оригинальной статьей Guiniu Notes. Для перепечатки обращаться ко мне не обязательно, но, пожалуйста, укажите, что она взята из Guiniu Notes, it3q.com.