webrtc的aec问题

在网上找了个aec的例子,使用波特率8000时,效果很好。但使用波特率16000的时候,完全没有效果。但aecm都是有效果的。8000时,效果没有aec好。各位帮忙看看,按道理说,aec是支持8k,16k,32k的。应该不会这样的

参考

采样率不同aec处理方式会有些区别。
但首先想确认下你配置成自动模式还是固定模式呢?

送接口的数据时间片长度为多少?

#define  NN 160

int WebRtcAecTest(int delay)
{
	short* far_frame = new short[NN];
	short* near_frame = new short[NN];
	short* out_frame = new short[NN];

	float* pfar_frame = new float[NN];
	float* pnear_frame = new float[NN];
	float* pout_frame = new float[NN];

	void *aecmInst = NULL;
	FILE *fp_far = fopen("16k/speaker.pcm", "rb");
	FILE *fp_near = fopen("16k/micin.pcm", "rb");
	FILE *fp_out = fopen("16k/out.pcm", "wb");

	do
	{
		if (!fp_far || !fp_near || !fp_out)
		{
			printf("WebRtcAecTest open file err \n");
			break;
		}
                // 1、创建aec
		aecmInst = WebRtcAec_Create();
		WebRtcAec_Init(aecmInst, 16000, 16000);

		//WebRtcAec_enable_delay_agnostic(WebRtcAec_aec_core(aecmInst), 1);
               //2、配置aec
		AecConfig config;
		config.nlpMode = kAecNlpAggressive;
		config.metricsMode = kAecFalse;
		config.delay_logging = kAecFalse;
		WebRtcAec_set_config(aecmInst, config);

		while (1)
		{
			if (NN == fread(far_frame, sizeof(short), NN, fp_far))
			{
				fread(near_frame, sizeof(short), NN, fp_near);
				for (int i = 0; i < NN; i++) {
					pfar_frame[i] = far_frame[i];
					pnear_frame[i] = near_frame[i];
				}
				WebRtcAec_BufferFarend(aecmInst, pfar_frame, NN);//对参考声音(回声)的处理

				WebRtcAec_Process(aecmInst, &pnear_frame, 1, &pout_frame, NN, delay, 0);//回声消除
				for (int i = 0; i < NN; i++) {
					out_frame[i] = pout_frame[i];
				}
				fwrite(out_frame, sizeof(short), NN, fp_out);
			}
			else
			{
				break;
			}
		}
	} while (0);

	fclose(fp_far);
	fclose(fp_near);
	fclose(fp_out);
	WebRtcAec_Free(aecmInst);
	return 0;
}

上面的就是相关代码

1.AecConfig没有初始化,你的配置可能不会生效。
2.试着调节delay的值,观察输出有没有变化。

有初始化的,上面代码中这部分就是。延时调节过0,30,40,50,100等值都没效果。使用aecm代码都是有效果的,效果和波特率8000是一样的

1.AecConfig所有的成员都要赋值的,你那个不能算真正初始化,当然可能-g编译的时候默认为0了;
2.你用的什么软件,有没有观察输出音频的波形,还有webrtcaec_process的返回值也看一下;
3.aecm和aec不同,delay的值不能共用,你可以继续尝试更多的值。

增加config.skewMode = kAecFalse;后,WebRtcAec_set_config返回成功了,并且有效果了。但前20秒,有明显的回音,后面的就没有回音。aecm无论8000和16000,效果都是一样的。
webrtcaec_process返回一直成功,使用的是cool edit。