pjsip 获取摄像头名称


很坑
当前时间:2019/12/12,pjsip发布2.9版本已经有段时间了。发现当前的pjsip库还是有很多地方不完善
为了将我的软电话添加视频支持。我需要重新编译pjsip库。
这篇文章里有详细的流程。

1, 添加视频支持的时候,config_site.h文件需要添加几个宏

/* 为了支持视频,只添加这一行还不行,还要添加专门的库 */
#define PJMEDIA_HAS_VIDEO 1
/*添加ffmpeg,可以支持多种编码:h264、h263*/ //vp8、vp9这个版本的pjsip不支持
#define PJMEDIA_HAS_FFMPEG 1
/*使用SDL作为显示用的*/
#define PJMEDIA_VIDEO_DEV_HAS_SDL 1
/*添加DSHOW,这个库是摄像头会用到*/
#define PJMEDIA_VIDEO_DEV_HAS_DSHOW 1

其中的 PJMEDIA_VIDEO_DEV_HAS_DSHOW 这个宏费了老劲。
因为使用这个宏之后,会报DShow的错误,CBaseRenderer 链接失败。
所以我自作聪明的使用了 PJMEDIA_VIDEO_DEV_HAS_FFMPEG 这个宏。但是呢这个宏会引起其他的问题。就是,摄像头的名称获取不到,

   0: default (ffmpeg dshow) - capture
      Supported formats:
       YUY2
   1: default (ffmpeg vfwcap) - capture
      Supported formats:
       YUY2

名称都是:default。我用其他方式(Qt或者直接ffmpeg),则可以获取正常的名称。
后来我跟到源码里面:

	info = &ff->dev_info[ff->dev_count++];
	pj_bzero(info, sizeof(*info));
	pj_ansi_strncpy(info->base.name, "default", 
	  sizeof(info->base.name));
	pj_ansi_snprintf(info->base.driver, sizeof(info->base.driver),
	   "ffmpeg %s", p->name);
	
	pj_strdup2_with_null(ff->pool, &dev_name, dev_names[dev_idx]);
	info->def_devname = dev_name.ptr;
	info->base.dir = PJMEDIA_DIR_CAPTURE;
	info->base.has_callback = PJ_FALSE;

在这里插入图片描述
发现这里根本没获取。
逼不得已,只能用DShow。

2,微软的坑

win10的SDK中把Samples的目录删除了。但是网上搜到的都要DirectShow,我把Win7的SDK下载了下来,编译出来了Strmbasd.lib ,发现还是用不了。后来我找到了pjproject-2.9\third_party\BaseClasses 这个目录。里面的renbase.h里有CBaseRenderer这个类。
原来pjsip已经准备好了
在这里插入图片描述
我这边生成了 libbaseclasses-i386-Win32-vc14-Debug-Dynamic.lib
将 libbaseclasses-i386-Win32-vc14-Debug-Dynamic.lib 链接到
pjmedia_videodev 这个工程中。然后重新生成 libpjproject工程,使用这时候的库就好了。
现在测试可以得到正常的设备名称了。
在这里插入图片描述

3 pjsip目前不支持vp8、vp9

下个版本应该就支持了。因为虽然ffmpeg支持vpx,但是pjsip没有实现接口,我从他们的开发分支上看到,他们貌似已经完成了。
这个我也找了大半天,最后还是翻源码才知道的。
在这里插入图片描述
目前发布的2.9版本只支持h263、h264。(跟ffmpeg取交集)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值