Compartir a través de


Generar datos en un filtro de captura

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/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 Audio/Video Capture 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 describe cómo un filtro de captura de DirectShow personalizado debe generar datos de salida.

Cambios de estado de filtro

Un filtro de captura solo debe generar datos cuando se ejecuta el filtro. No envíe datos desde las patillas cuando el filtro esté en pausa. Además, devuelve VFW_S_CANT_CUE del método CBaseFilter::GetState cuando el filtro está en pausa. Este valor devuelto informa al Administrador de gráficos de filtros que no debe esperar ningún dato del filtro mientras el filtro está en pausa. Para obtener más información, vea Estados de filtro.

El código siguiente muestra cómo implementar el método IMediaFilter::GetState :

CMyVidcapFilter::GetState(DWORD dw, FILTER_STATE *pState)
{
    CheckPointer(pState, E_POINTER);
    *pState = m_State;
    if (m_State == State_Paused)
    {
        return VFW_S_CANT_CUE;
    }
    else
    {
        return S_OK;
    }
}

Control de flujos individuales

Las patillas de salida de un filtro de captura deben admitir la interfaz IAMStreamControl , de modo que una aplicación pueda activar o desactivar cada pin individualmente. Por ejemplo, una aplicación puede obtener una vista previa sin capturar y, a continuación, cambiar al modo de captura sin volver a generar el gráfico de filtros. Puede usar la clase CBaseStreamControl para implementar esta interfaz.

Marcas de tiempo

Cuando el filtro captura un ejemplo, marca de tiempo la muestra con la hora actual de la secuencia. La hora de finalización es la hora de inicio más la duración. Por ejemplo, si el filtro captura en diez muestras por segundo y el tiempo de secuencia es de 200 000 000 unidades cuando el filtro captura la muestra, las marcas de tiempo deben ser 2000000000 y 20100000000. (Hay 10 000 000 unidades por segundo).

Para calcular el tiempo de la secuencia, llame al método IReferenceClock::GetTime para obtener la hora de referencia actual y, a continuación, substract la hora de inicio original. Como alternativa, llame al método CBaseFilter::StreamTime , que realiza el mismo cálculo. Para establecer la marca de tiempo en un ejemplo, llame al método IMediaSample::SetTime .

Sin embargo, si el filtro tiene un pin de vista previa, los ejemplos del pin de vista previa no deben tener marcas de tiempo. El motivo es que los ejemplos siempre llegarán al representador ligeramente después del tiempo de captura. Si las muestras tienen marca de tiempo, el representador las tratará como tardías y puede intentar ponerse al día quitando muestras. (Para obtener más información, consulte DirectShow Video Capture Filters).) Tenga en cuenta que la interfaz IAMStreamControl requiere la patilla para realizar un seguimiento de los tiempos de ejemplo. En el caso de un pin de vista previa, es posible que tenga que modificar la implementación para que no se base en marcas de tiempo.

Las marcas de tiempo siempre deben aumentar de una muestra a la siguiente. Esto es cierto incluso cuando el filtro se detiene. Si el filtro se ejecuta, se pausa y, a continuación, se ejecuta de nuevo, el primer ejemplo después de la pausa debe tener una marca de tiempo mayor que la última muestra antes de la pausa.

Dependiendo de los datos que capture, puede ser adecuado establecer el tiempo multimedia en los ejemplos.

Para obtener más información, vea Hora y relojes en DirectShow.

Filtros de captura de vídeo de DirectShow

Hora y relojes en DirectShow

Escribir filtros de captura