pjsip 获取摄像头名称

文章目录

  • 1, 添加视频支持的时候,config_site.h文件需要添加几个宏
  • 2,微软的坑
  • 3 pjsip目前不支持vp8、vp9

很坑
当前时间: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;

pjsip 获取摄像头名称_第1张图片
发现这里根本没获取。
逼不得已,只能用DShow。

2,微软的坑

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

3 pjsip目前不支持vp8、vp9

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

你可能感兴趣的:(pjsip)