媒体基金会毫秒曝光 在我问我的问题之前,我需要说明我主要是Linux C++开发人员,并且没有编写Windows应用程序的丰富经验。我使用g++编译所有代码,而不是使用Microsoft编译器
背景 一段时间以来,我一直在开发一个支持各种专业摄像机的科学成像应用程序。大多数相机都有制造商提供的SDK,这使得开发更加容易。但是,我的应用程序支持的一些相机是标准的UVC相机。直到最近,这个应用程序一直是专门针对Linux的,但现在正被移植到macOS和Windows媒体基金会毫秒曝光 在我问我的问题之前,我需要说明我主要是Linux C++开发人员,并且没有编写Windows应用程序的丰富经验。我使用g++编译所有代码,而不是使用Microsoft编译器,c++,windows,directshow,ms-media-foundation,uvc,C++,Windows,Directshow,Ms Media Foundation,Uvc,背景 一段时间以来,我一直在开发一个支持各种专业摄像机的科学成像应用程序。大多数相机都有制造商提供的SDK,这使得开发更加容易。但是,我的应用程序支持的一些相机是标准的UVC相机。直到最近,这个应用程序一直是专门针对Linux的,但现在正被移植到macOS和Windows Linux端口通过Video4Linux实现对UVC的支持,并且可以正常工作 非常好 macOS端口通过libuvc实现对UVC的支持 )而且效果很好 问题:Windows UVC支持 我在Windows上实现UVC摄像头时遇
在使用DirectShow或Media Foundation的Windows上使用同一相机时,曝光范围是非常不同的。我使用以下代码查询曝光控制的范围:
HRESULT hr;
IAMCameraControl *cam_ctrl = NULL;
long lmin, lmax, lstep, ldft, lcap;
hr = m_imf_media_source->QueryInterface(IID_IAMCameraControl, (void**) &cam_ctrl);
if (FAILED(hr))
{
throw_error(hr);
}
hr = cam_ctrl->GetRange(CameraControl_Exposure, &lmin, &lmax, &lstep, &ldft, &lcap);
if (FAILED(hr))
{
if (hr == E_PROP_ID_UNSUPPORTED)
{
*min = 0;
*max = 0;
*value = 0;
return false;
}
else
{
throw_error(hr);
}
}
*min = static_cast<int>(lmin);
*max = static_cast<int>(lmax);
*value = static_cast<int>(ldft);
return true;
HRESULT-hr;
IAMCameraControl*cam\U ctrl=NULL;
长lmin、lmax、lstep、ldft、lcap;
hr=m_imf_media_source->QueryInterface(IID_IAMCameraControl,(void**)和cam_ctrl);
如果(失败(小时))
{
抛出错误(hr);
}
hr=cam\u ctrl->GetRange(CameraControl\u曝光,&lmin,&lmax,&lstep,&ldft,&lcap);
如果(失败(小时))
{
如果(hr==E_PROP_ID_UNSUPPORTED)
{
*最小值=0;
*max=0;
*数值=0;
返回false;
}
其他的
{
抛出错误(hr);
}
}
*最小值=静态压力(lmin);
*最大值=静态压力(lmax);
*值=静态施法(ldft);
返回true;
如文档所述,从proc_amp->GetRange中发现的值不是实时单位。例如,该值为-11到-3,对于支持大于1000ms曝光的某些UVC相机,该值为正值。当我将曝光应用于流时,步骤非常粗糙。如前所述,Linux下这个特定相机的曝光步骤是线性的,有数百个步骤。在窗户里只有大约14个
我的主要问题是:在DirectShow或Media Foundation中使用具有实时单元的UVC摄像机是可能的,如果是,这是如何做到的?如果有人有意见的话,我很乐意考虑另一种方法。遗憾的是,这种粗略的曝光步骤是不可接受的
我知道Windows支持libuvc,但它需要安装一个特定的驱动程序,这是我不希望我的用户做的事情
非常感谢您的帮助
Amanda。您是否尝试过“使用KSPROPERTY\u CAMERACONTROL\u EXTENDED\u EXPOSUREMODE属性,当用于手动设置曝光时,KSCAMERA\u EXTENDEDPROP\u VIDEOPROCFLAG\u MANUAL,VideoProc.Value.ul值是以100纳秒为单位的曝光时间。”事实上,根据您的上下文,使用WinRT的MediaCapture类可能更容易:它有VideoDeviceController来配置exposureKSPROPERTY\u CAMERACONTROL\u EXTENDED\u EXPOSUREMODE似乎正是我需要的。你知道有什么C++示例代码演示了如何使用这个属性吗?我不知道,这里有一个例子:但不清楚你是否能真正使用它。一个微软的家伙明确地说官方访问是WinRT。。。也许你可以插话。