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_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 オブジェクトは、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 をアクティブにするには、カメラ ソースに渡される IMFActivate に MF_DEVSOURCE_ATTRIBUTE_FRAMESERVER_SHARE_MODE 属性が必要です。 前述のように、IMFActivate::ActivateObject 呼び出された後、アクティブ化されたオブジェクトに属性の変更を反映させるには、DetachObject を呼び出す必要があります。
MediaCapture を使用して共有モードを構成する
MediaCapture クラスを使用してカメラにアクセスする場合は、MediaCaptureInitializationSettings.SharingMode プロパティを使用して共有モードを設定します。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント |
Windows 11 ビルド 26100 |
サポートされている最小サーバー |
Windows Server |
ヘッダ |
|
関連項目