SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4409|回复: 0
打印 上一主题 下一主题

[webrtc] 在Win10,2019年MacBook Pro中摄像头运行异常

[复制链接]

187

主题

346

帖子

2450

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2450
跳转到指定楼层
楼主
发表于 2020-1-30 20:56:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ancientcc 于 2020-1-30 21:02 编辑

通过dxdiag,exe,出问题电脑的系统型号:macbookpro15,2

问题描述。运行Win10自带的“相机”可以正常打开摄像头。运行AMCap,无法打开摄像头。运行GraphEdit.exe,用NV12时可以打开摄像头,但YUY2时,不论1280x720还是640x480,都不能看到摄像头图像。运行自写的基于webrtc app,也是摄像头不正常,具体是Run成功了,但没有收到图像。

分析原因。该摄像头支持两种颜色空间:NV12和YUY2。NV12正常(但不完全符合规范,像AMCap换成NV12还是不正常),YUY2不正常,不正常的原因极可能出在摄像头硬件,因为我看这个驱动程序装载的相关软件就是标准的UVC驱动须要的文件。

如何解决。试着把2017年MacBook Pro上的摄像头驱动移植过来,但发现这两摄像头架构不一样,2019年的可能是UVC,全用了Win10自带驱动。而2015年的不是。于是深入webrtc代码,发现在windows平台,webrtc是没考虑支持NV12,于是做以下修改。

  1. <webrtc>/modules/video_capture/windows/device_info_ds.cc
  2. ---DeviceInfoDS::CreateCapabilityMap(const char* deviceUniqueIdUTF8)
  3. 增加
  4. else if (pmt->subtype == MEDIASUBTYPE_NV12) {
  5.   capability.videoType = VideoType::kNV12;
  6. }

  7. <webrtc>/modules/video_capture/windows/sink_filter_ds.cc
  8. ---CaptureInputPin::GetMediaType(IN int iPosition, OUT CMediaType* pmt)
  9. case 5: {
  10.   pvi->bmiHeader.biCompression = MAKEFOURCC('N', 'V', '1', '2');
  11.   pvi->bmiHeader.biBitCount = 12;  // bit per pixel
  12.   pvi->bmiHeader.biWidth = _requestedCapability.width;
  13.   pvi->bmiHeader.biHeight = _requestedCapability.height;
  14.   pvi->bmiHeader.biSizeImage = 3 * _requestedCapability.height * _requestedCapability.width / 2;
  15.   pmt->SetSubtype(&MEDIASUBTYPE_NV12);
  16. } break;

  17. ---CaptureInputPin::CheckMediaType(IN const CMediaType* pMediaType)
  18. 两处,*formatType == FORMAT_VideoInfo和*formatType == FORMAT_VideoInfo2都要增加。
  19. if (*SubType == MEDIASUBTYPE_NV12 && pvi->bmiHeader.biCompression == MAKEFOURCC('N', 'V', '1', '2')) {
  20.   _resultingCapability.videoType = VideoType::kNV12;
  21.   return S_OK;  // This format is acceptable.
  22. }

  23. <webrtc>/modules/video_capture/device_info_impl.cc
  24. ---int32_t VideoCaptureDS::SetCameraOutput
  25. hr = _graphBuilder->ConnectDirect(_outputCapturePin, _inputSendPin, NULL);
  26. 改为在NV12时需要显示提供AM_MEDIA_TYPE。
  27. AM_MEDIA_TYPE mt;
  28. AM_MEDIA_TYPE* pmt = NULL;
  29. memset(&mt, 0, sizeof(mt));
  30. mt.majortype = MEDIATYPE_Video;
  31. if (_requestedCapability.videoType == VideoType::kNV12) {
  32.   mt.subtype = MEDIASUBTYPE_NV12;
  33.   pmt = &mt;
  34. }
  35. hr = _graphBuilder->ConnectDirect(_outputCapturePin, _inputSendPin, pmt);
复制代码


经过以上修改,640x480是可以了,但1280x720还是不行。另外VideoCaptureDS::SetCameraOutput中,_dsInfo.GetBestMatchedCapability得到的capability其实是kYUY2,不是应该的kNV12!但不影响结果,不对DeviceInfoImpl::GetBestMatchedCapability做修改了。

这问题或许得等win10有升级或使用了新版本webrtc源码。对win10升级,可用AMCap是否正常了进行判断。对webrtc源码,判断方法是看win10上是否支持NV12,一种快速方法是看<webrtc>/modules/video_capture/windows/device_info_ds.cc中的DeviceInfoDS::CreateCapabilityMap是否有了MEDIASUBTYPE_NV12判断入口。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2024-5-20 01:16 , Processed in 0.057370 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表