次の方法で共有


MF_DEVSOURCE_ATTRIBUTE_FRAMESERVER_SHARE_MODES属性

IMFMEdiaSource のインスタンスによって表されるカメラ デバイス ソースを、制御モードまたは共有モードに構成します。

データ型

UINT32 する

Get/set

この属性を取得するには、IMFAttributes::GetUINT32を呼び出します。

この属性を設定するには、IMFAttributes::SetUINT32を呼び出します。

備考

この属性が設定されていないか、0 の値に設定されている場合、カメラ デバイス ソースは制御モードで構成されます。 これはカメラ ソースの既定のモードです。 制御モードでは、すべてのカメラ操作を使用でき、アプリケーションによってメディアの種類や拡張カメラ コントロールが変更される場合があります。

IMFMediaSource の 1 つの制御モード インスタンスのみがアクティブな状態にすることができます。 IMFMediaSource は、初期化された後はアクティブとは見なされません。 メディア ソースは、ストリームが開始された後にのみアクティブになり、IMFMediaSource::Start 呼び出し、またはカメラ コントロールの値が設定された後、IKsControl::KsProperty を呼び出して、KSPROPERTYSETID_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 オブジェクトは、ActivateObject の呼び出しから新しく作成 IMFMediaSource内部的にキャッシュされることに注意してください。 そのため、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 をアクティブにするには、カメラ ソースに渡される IMFActivateMF_DEVSOURCE_ATTRIBUTE_FRAMESERVER_SHARE_MODE 属性が必要です。 前述のように、IMFActivate::ActivateObject 呼び出された後、アクティブ化されたオブジェクトに属性の変更を反映させるには、DetachObject を呼び出す必要があります。

MediaCapture を使用して共有モードを構成する

MediaCapture クラスを使用してカメラにアクセスする場合は、MediaCaptureInitializationSettings.SharingMode プロパティを使用して共有モードを設定します。

必要条件

要件 価値
サポートされる最小クライアント
Windows 11 ビルド 26100
サポートされている最小サーバー
Windows Server
ヘッダ
Mfidl.h

関連項目

Media Foundation 属性のアルファベット順の一覧

オーディオ/ビデオ キャプチャ

デバイス属性 をキャプチャする