记一次pjsip通话没声音的调试过程

1、定位:首先就是定位是否有流,将dev port的frame写文件,conference port的frame写文件,stream port的frame写文件。发现从stream port开始,frame就是空的了。(写文件的位置一般都在相应port的put_frame实现中,因为是编码方向的流)
2、调试:检查port连接是否异常,发现port一开始连接正常,但是中途发生了media channel update,stream被destroy然后重新create,start,这个时候stream port本应和conference port重新连接起来的但是发现并没有,这一步产生两个疑点:首先为什么会发生media channel update且codec param协商失败?这是因为stream create会置 code param的vad参数为0,stream port的put_frame中才会真正使能这个参数(但是需要过一段时间,这个时间由PJMEDIA_STREAM_VAD_SUSPEND_MSEC来控制,具体可参考pjsip中的注释),由于update到来的时,这个参数还没有使能,因此media update channel时codec param参数协商失败。其次为什么stream destroy然后再creat,start,stream port就没有和conference port连接了?这是因为前面的人修改了on_call_audio_state的实现,在连接conference port和stream port前加了判断,call state是confirm状态就不连接,所以才会出现通话中channel update时重启stream会导致stream中没有流。
3、解决:三个方案选其一
channel update时不比较codec的vad参数
将PJMEDIA_STREAM_VAD_SUSPEND_MSEC改小,保证update前codec的vad参数已经修改过来
将on_call_audio_state中连接port前的判断去掉

你可能感兴趣的:(记一次pjsip通话没声音的调试过程)