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;
}
一般类型会直接进入generic_match 就行判断对应类型各项是否相等
Local_payloads 设置是在方法: sal_call_set_local_media_description
Remote_payloads 设置是在方法: sdp_to_media_description
也就是linphone 为了保证通话双方能够在一个频道(音频编解码相同),所以会选择一个双方都使用的clock_rate相同的编码格式,这个从log打印的sip通信过程也可以看出来,如下:
![](https://img-blog.csdn.net/2018022821175656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1bGl1MDMyMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](https://img-blog.csdn.net/20180228211812215?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1bGl1MDMyMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
相当于在正常通话之前,2端要确定好传输数据的编解码类型和采样率,当然采样位数都是16
搞到这也算是知道原因了…
默认采用的是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
搞到这也算是知道原因了…
相关文章推荐
- 连接linphone的服务器实现来电通话的问题解决
- spring+activemq中多个consumer同时处理消息时遇到的性能问题
- 安装SQL2000经常遇到的问题处理 推荐
- linphone 手机上不能接听电话
- WinCE应用程序开发--改变目标平台时遇到的问题。
- 处理浏览器兼容所遇到的问题总结(一)
- Des 加密处理 iOS 和 安卓 与服务器 处理时 遇到的 补位问题
- sqlite3 jdbc、c接口、python接口处理中文时遇到的问题及其解决方法
- 体验MySQL5.6.25并处理所遇到的问题
- SharePoint项目中新建类库的错误处理及项目建设中遇到的问题总结
- 如何处理监控类直播中遇到的奇葩问题
- win10处理.mat文件遇到的问题+matlab激活
- javaweb-react的入门遇到的问题三:ajax获取数据与循环处理放入列表
- JavaWeb中常常遇到的乱码问题处理-更正
- tomcat程序部署到weblogic遇到的问题:对于字符串空的处理不一样
- 工作中ORACLE操作中遇到的问题和处理方式记录
- 图片处理中遇到的mat 转image的问题
- IdHTTP处理HTTP 302遇到的问题
- FastJson处理json数据时遇到一个问题
- 图像处理遇到的一些问题整理(OpenCV and Emgu)