MF_DEVSOURCE_ATTRIBUTE_FRAMESERVER_SHARE_MODES属性
将 IMFMEdiaSource 实例表示的相机设备源配置为处于控制模式或共享模式。
数据类型
UINT32
获取/设置
若要获取此属性,请调用 IMFAttributes::GetUINT32。
若要设置此属性,请调用 IMFAttributes::SetUINT32。
言论
如果未将此属性设置为 0 值,则会在控制模式下配置相机设备源。 这是相机源的默认模式。 在控制模式下,所有相机操作都可用,应用程序可能会更改媒体类型和/或扩展相机控件。
IMFMediaSource 的一个控制模式实例 随时只能处于活动状态。 IMFMediaSource 在创建初始化后不被视为处于活动状态。 媒体源仅在流启动后变为活动状态,调用 IMFMediaSource::Start,或者通过调用 IKsControl::KsPropertyKSPROPERTYSETID_ExtendedCameraControl 来设置相机控件的值,或者通过使用 IMFExtendedCameraControl 接口来设置相机控件。 有关获取 IMFExtendedCameraControl实例的信息,请参阅 IMFExtendedCameraController
如果另一个控制模式实例已处于活动状态,则尝试呈现活动 IMFMediaSource 实例将导致共享冲突。
随时可以任意数量的活动共享模式实例 IMFMediaSource,并且可在控制模式实例处于活动状态时激活新创建的共享模式实例。 共享模式实例无法更改媒体类型,并且必须使用当前媒体类型。 共享模式实例无法更改 KSPROPERTYSETID_ExtendedCameraControl 控件。 共享模式实例可以更改旧式相机控件,例如 PROPSETID_VIDCAP_CAMERACONTROL 和 PROPSETID_VIDCAP_VIDEOPROCAMP 和 OEM/IHV 特定的控件。
若要将相机源配置为处于共享模式,必须在 IMFMediaSource 创建时设置该属性。
使用 MFCreateDeviceSource 配置共享模式
以下代码示例演示如何使用 MFCreateDeviceSource在共享模式下创建实例。
HRESULT
SampleCreateSharedModeCamera(
_In_z_ LPCWSTR cameraSymbolicName,
_COM_Outptr_ IMFMediaSource** cameraSource
)
{
wil::com_ptr_nothrow<IMFAttributes> initAttributes;
RETURN_HR_IF_NULL (E_INVALIDARG, cameraSymbolicName);
RETURN_HR_IF_NULL (E_POINTER, cameraSource);
*cameraSource = nullptr;
RETURN_IF_FAILED (MFCreateAttributes(&initAttributes, 3));
RETURN_IF_FAILED (initAttributes->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID));
RETURN_IF_FAILED (initAttributes->SetString(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK, cameraSymbolicName));
RETURN_IF_FAILED (initAttributes->SetUINT32(MF_DEVSOURCE_ATTRIBUTE_FRAMESERVER_SHARE_MODE, 1));
RETURN_IF_FAILED (MFCreateDeviceSource(initAttributes.get(), cameraSource));
return S_OK;
}
使用 IMFActivate 配置共享模式
以下示例演示如何使用 IMFActivate创建 IMFMediaSource 实例。 请注意,IMFActivate 对象将在内部缓存从调用 ActivateObjectIMFMediaSource。 因此,如果在调用 detachObject 之前再次调用 ActivateObject,将返回缓存实例,并且将忽略对属性所做的任何更改。
HRESULT
SampleCreateSharedModeCameraFromActivate(
_In_ IMFActivate* activate,
_COM_Outptr_ IMFMediaSource** cameraSource
)
{
RETURN_HR_IF_NULL (E_INVALIDARG, activate);
RETURN_HR_IF_NULL (E_POINTER, cameraSource);
*cameraSource = nullptr;
RETURN_IF_FAILED (activate->SetUINT32(MF_DEVSOURCE_ATTRIBUTE_FRAMESERVER_SHARE_MODE, 1));
RETURN_IF_FAILED (activate->ActivateObject(IID_PPV_ARGS(cameraSource)));
return S_OK;
}
使用 IMFCaptureEngine 配置共享模式
若要使用 IMFCaptureEngine在共享模式下激活 IMFMediaSource,IMFActivate 为相机源传入时必须具有 MF_DEVSOURCE_ATTRIBUTE_FRAMESERVER_SHARE_MODE 属性。 如上所述,调用 IMFActivate::ActivateObject 后,必须调用 detachObject ,才能在激活的对象中反映任何属性更改。
使用 MediaCapture 配置共享模式
使用 MediaCapture 类访问相机时,请使用 MediaCaptureInitializationSettings.SharingMode 属性设置共享模式。
要求
要求 | 价值 |
---|---|
支持的最低客户端 |
Windows 11 内部版本 26100 |
支持的最低服务器 |
Windows Server |
页眉 |
|
另请参阅