采用linphone 进行语音通话,获取语音数据进行识别的时候发现效果不是很好,由于通话采用的采样率是8000,我想将linphone的通话采样率变为16000,看看实际效果如何:
默认采用的是PCMA的格式,由于语音识别接口只接受PCM或者wav这种不压缩的格式,所以我没有想修改linphone通话的payload类型,直接去将pcma的采样率变成16000,使用代码管理,到时候不需要了也能直接回退。
具体修改的地方:
1.将alaw.c 文件中获取sample的方法返回值由8000变为16000;
2.将ortp中avprofile.c文件中 PCMA格式的clock_rate 由8000变为16000;
这2个是在获取和设置采样率的时候会用到的,但是在配置这2个后,发现
只是resample 这个filter 将采样率由48000变为了16000, 但是打log 发现 PCMA格式的clock_rate 还是8000,比较困惑 ,重新看了下linphone 接电话的流程。
Linphone 有读配置文件,然后我将配置文件中的PCMA格式改为了16000,发现linphone通话payload不再使用PCMA,改为PCMU了。
我从 linphone_core_invite_address_with_params 开始查看到payload选择的整个过程。
一个比较关键的函数是:linphone_call_start_audio_stream 这个函数是通话流开始也就是接通前会调用的,里面调用了audio_stream_from_io这个方法,这个方法中和payload相关的函数是make_profile函数,这个函数关键的参数是call->resultdesc,所以找到这个在哪赋值的就知道哪出问题了。
查看发现reslutdesc的赋值和local_payload以及remote_payload相关
linphone 关于payload处理,会匹配local 和remote 情况,具体方法
在:sdp_process
在 offer_answer_initiate_incoming
在 initiate_incoming
在 match_payloads
添加payload时会对local_payloads 以及remote_payloads 进行比较;
函数是
static PayloadType * find_payload_type_best_match(MSFactory *factory, const bctbx_list_t *local_payloads, const PayloadType *refpt,
const bctbx_list_t *remote_payloads, bool_t reading_response){
PayloadType *ret = NULL;
MSOfferAnswerContext *ctx = NULL;
// When a stream is inactive, refpt->mime_type might be null
if (refpt->mime_type && (ctx = ms_factory_create_offer_answer_context(factory, refpt->mime_type))) {
ms_message("Doing offer/answer processing with specific provider for codec [%s]", refpt->mime_type);
ret = ms_offer_answer_context_match_payload(ctx, local_payloads, refpt, remote_payloads, reading_response);
ms_offer_answer_context_destroy(ctx);
ms_warning("entered into this. mimetype: %s, ctx->mimetype",refpt->mime_type);
return ret;
}
ms_warning("just generic_match.");
return generic_match(local_payloads, refpt, remote_payloads);
}
一般类型会直接进入generic_match 就行判断对应类型各项是否相等
Local_payloads 设置是在方法: sal_call_set_local_media_description
Remote_payloads 设置是在方法: sdp_to_media_description
也就是linphone 为了保证通话双方能够在一个频道(音频编解码相同),所以会选择一个双方都使用的clock_rate相同的编码格式,这个从log打印的sip通信过程也可以看出来,如下:


相当于在正常通话之前,2端要确定好传输数据的编解码类型和采样率,当然采样位数都是16
搞到这也算是知道原因了… |