Compartir a través de


Requisitos de anclaje para filtros de captura

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEnginey captura de audio y vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y captura de audio y vídeo en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

En este tema se describen los requisitos para implementar un pin de salida en un filtro de captura DirectShow.

Nombre de patilla

Puede asignar un pin a cualquier nombre. Si el nombre del pin comienza con el carácter tilde (~), el Administrador de gráficos de filtros no representa automáticamente ese pin cuando una aplicación llama a IGraphBuilder::RenderFile. Por ejemplo, si el filtro tiene un pin de captura y un pin de vista previa, puede asignarles el nombre "~Capture" y "Preview", respectivamente. Si una aplicación representa ese filtro en un gráfico, el pin de vista previa se conectará a su representador predeterminado y nada se conectará al pin de captura, que es un comportamiento predeterminado razonable. Esto también se puede aplicar a los patillas que proporcionan datos informativos que no están diseñados para representarse o a los patillas que necesitan un conjunto de propiedades personalizadas. Tenga en cuenta que las patillas con el prefijo tilde (~) todavía se pueden conectar manualmente mediante la aplicación.

Pin Category

Un filtro de captura siempre tiene un pin de captura y es posible que tenga un pin de vista previa. Algunos filtros de captura pueden tener otros pines de salida para entregar otros tipos de datos, como la información de control. Cada pin de salida debe exponer la interfaz IKsPropertySet. Las aplicaciones usan esta interfaz para determinar la categoría de patillas. El pin normalmente devuelve PIN_CATEGORY_CAPTURE o PIN_CATEGORY_PREVIEW. Para obtener más información, vea Conjunto de propiedades pin.

En el ejemplo siguiente se muestra cómo implementar IKsPropertySet para devolver la categoría de pin en un pin de captura:

// Set: Cannot set any properties.
HRESULT CMyCapturePin::Set(REFGUID guidPropSet, DWORD dwID,
    void *pInstanceData, DWORD cbInstanceData, void *pPropData, 
    DWORD cbPropData)
{
    return E_NOTIMPL;
}

// Get: Return the pin category (our only property). 
HRESULT CMyCapturePin::Get(
    REFGUID guidPropSet,   // Which property set.
    DWORD dwPropID,        // Which property in that set.
    void *pInstanceData,   // Instance data (ignore).
    DWORD cbInstanceData,  // Size of the instance data (ignore).
    void *pPropData,       // Buffer to receive the property data.
    DWORD cbPropData,      // Size of the buffer.
    DWORD *pcbReturned     // Return the size of the property.
)
{
    if (guidPropSet != AMPROPSETID_Pin) 
        return E_PROP_SET_UNSUPPORTED;
    if (dwPropID != AMPROPERTY_PIN_CATEGORY)
        return E_PROP_ID_UNSUPPORTED;
    if (pPropData == NULL && pcbReturned == NULL)
        return E_POINTER;
    if (pcbReturned)
        *pcbReturned = sizeof(GUID);
    if (pPropData == NULL)  // Caller just wants to know the size.
        return S_OK;
    if (cbPropData < sizeof(GUID)) // The buffer is too small.
        return E_UNEXPECTED;
    *(GUID *)pPropData = PIN_CATEGORY_CAPTURE;
    return S_OK;
}

// QuerySupported: Query whether the pin supports the specified property.
HRESULT CMyCapturePin::QuerySupported(REFGUID guidPropSet, DWORD dwPropID,
    DWORD *pTypeSupport)
{
    if (guidPropSet != AMPROPSETID_Pin)
        return E_PROP_SET_UNSUPPORTED;
    if (dwPropID != AMPROPERTY_PIN_CATEGORY)
        return E_PROP_ID_UNSUPPORTED;
    if (pTypeSupport)
        // We support getting this property, but not setting it.
        *pTypeSupport = KSPROPERTY_SUPPORT_GET; 
    return S_OK;
}

escribir filtros de captura