您的位置:首页 > 其它

Linphone改变电话通话采样率由8000变为16000处理遇到的问题

2018-02-28 21:20 507 查看
采用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

搞到这也算是知道原因了…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: