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_CAMERACONTROLPROPSETID_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在共享模式下激活 IMFMediaSourceIMFActivate 为相机源传入时必须具有 MF_DEVSOURCE_ATTRIBUTE_FRAMESERVER_SHARE_MODE 属性。 如上所述,调用 IMFActivate::ActivateObject 后,必须调用 detachObject ,才能在激活的对象中反映任何属性更改。

使用 MediaCapture 配置共享模式

使用 MediaCapture 类访问相机时,请使用 MediaCaptureInitializationSettings.SharingMode 属性设置共享模式。

要求

要求 价值
支持的最低客户端
Windows 11 内部版本 26100
支持的最低服务器
Windows Server
页眉
Mfidl.h

另请参阅

媒体基础属性的字母顺序列表

音频/视频捕获

捕获设备属性