Partilhar via


MF_DEVSOURCE_ATTRIBUTE_FRAMESERVER_SHARE_MODES atributo

Configura uma fonte de dispositivo de câmera representada por uma instância de IMFMEdiaSource estar no modo de controle ou no modo de compartilhamento.

Tipo de dados

UINT32

Obter/definir

Para obter esse atributo, chame IMFAttributes::GetUINT32.

Para definir esse atributo, chame IMFAttributes::SetUINT32.

Comentários

Quando esse atributo não está definido ou definido como 0 valor, a fonte do dispositivo da câmera é configurada no modo de controle. Este é o modo padrão para fontes de câmera. Quando no modo de controle, todas as operações da câmera estão disponíveis e o aplicativo pode alterar os tipos de mídia e/ou controles estendidos da câmera.

Apenas uma instância de modo de controle de IMFMediaSource pode estar em um estado ativo a qualquer momento. Um IMFMediaSource não é considerado ativo depois de ter sido criado um inicializado. A fonte de mídia só se torna ativa depois que o fluxo foi iniciado, com uma chamada para IMFMediaSource::Start, ou depois que um valor de controle de câmera é definido pela emissão de um controle de câmera chamando IKsControl::KsProperty com a propriedade definida KSPROPERTYSETID_ExtendedCameraControl ou usando o IMFExtendedCameraControl interface. Para obter informações sobre como obter a instância de IMFExtendedCameraControl, consulte IMFExtendedCameraController

A tentativa de tornar ativa uma instância de IMFMediaSource quando outra instância do modo de controle já estiver ativa resultará em uma violação de compartilhamento.

A qualquer momento, pode haver um número arbitrário de instâncias de modo de compartilhamento ativo de IMFMediaSource e instâncias de modo de compartilhamento recém-criadas podem ser ativadas enquanto uma instância de modo de controle estiver ativa. As instâncias do modo de compartilhamento não podem alterar os tipos de mídia e devem usar o tipo de mídia atual em uso. As instâncias do modo de compartilhamento não podem alterar KSPROPERTYSETID_ExtendedCameraControl controles. Os controles de câmera herdados, como PROPSETID_VIDCAP_CAMERACONTROL e PROPSETID_VIDCAP_VIDEOPROCAMP e controles específicos de OEM/IHV, podem ser alterados por instâncias de modo de compartilhamento.

Para configurar uma fonte de câmera para estar no modo de compartilhamento, o atributo deve ser definido no momento da criação do IMFMediaSource IMFMediaSource.

Configurar o modo de compartilhamento usando MFCreateDeviceSource

O exemplo de código a seguir ilustra a criação de uma instância no modo de compartilhamento usando 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;
}

Configurar o modo de compartilhamento usando IMFActivate

O exemplo a seguir ilustra a criação de uma instância de IMFMediaSource usando IMFActivate. Observe que o IMFActivate objeto armazenará em cache internamente um IMFMediaSource recém-criado da chamada para ActivateObject . Portanto, se ActivateObject for chamado novamente antes que uma chamada para DetachObject seja feita, a instância armazenada em cache será retornada e quaisquer alterações nos atributos serão ignoradas.

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;
}

Configurar o modo de compartilhamento usando IMFCaptureEngine

Para ativar o IMFMediaSource no modo de compartilhamento usando IMFCaptureEngine, o IMFActivate passado para a fonte da câmera deve ter o atributo MF_DEVSOURCE_ATTRIBUTE_FRAMESERVER_SHARE_MODE. Como dito acima, depois que IMFActivate::ActivateObject é chamado, DetachObject deve ser chamado para que quaisquer alterações de atributo sejam refletidas no objeto ativado.

Configurar o modo de compartilhamento usando MediaCapture

Ao acessar a câmera usando a classe MediaCapture, defina o modo de compartilhamento usando a propriedade MediaCaptureInitializationSettings.SharingMode.

Requerimentos

Exigência Valor
Cliente mínimo suportado
Windows 11, compilação 26100
Servidor mínimo suportado
Servidor Windows
Cabeçalho
Mfidl.h

Ver também

Lista alfabética de atributos do Media Foundation

Captura de áudio/vídeo

Atributos do dispositivo de captura