pjsua中视频呼叫正常流程是电脑端向服务器发起呼叫后,不断的向服务器发送本地视频流,以保证服务器知道电脑端的视频流地址,当服务器将远程视频流发送到电脑端后,
电脑端停止向服务器发送视频流即可。
出现问题是大多数电脑正常接收服务器视频流并显示,有的电脑不插摄像头接收不到服务端的视频流,有的笔记本有摄像头也接收不到视频流
查找原因为:有的电脑端不插摄像头无法向服务器发送视频流,导致服务器不知道电脑端的视频流地址,所以视频流传不回来。
最后确定问题根源为:程序中用pjsua采集本地视频时,没有指定采集源,采集源用摄像头或者Colorbar generator时,都会正常的向服务器发送本地视频流,
但是有的电脑安装了虚拟摄像头,当采集源是虚拟摄像头的时候,pjsua不支持虚拟摄像头,发送视频流失败。
解决方法:在pjsua中发送本地视频流之前,指定采集源为Colorbar generator
pjsua_media_channel_update函数中如下位置添加如下代码(用到的几个变量的声明没有贴出来)
/* Update audio channel */
if (media_changed) {
pjsua_vid_enum_devs(vid_dev_info, &nDeviceMax);
for (nDeviceCount=0;nDeviceCount<nDeviceMax;nDeviceCount++) {//查找视频采集设备为<span style="font-family: Arial, Helvetica, sans-serif;">Colorbar generator</span>
if (vid_dev_info[nDeviceCount].fmt_cnt && (vid_dev_info[nDeviceCount].dir==PJMEDIA_DIR_ENCODING || vid_dev_info[nDeviceCount].dir==PJMEDIA_DIR_ENCODING_DECODING)) {
if (!strcmp("Colorbar generator",vid_dev_info[nDeviceCount].name))
{
call_med->strm.v.cap_dev = vid_dev_info[nDeviceCount].id;//指定采集源为<span style="font-family: Arial, Helvetica, sans-serif;">Colorbar generator</span>
break;
}
}
}
status = pjsua_vid_channel_update(call_med,
call->inv->pool, si,
local_sdp, remote_sdp);
20170905更新:
pjsua有设置视频采集设备的接口,直接调用设置合适的视频采集设备即可。