Introducción al desarrollo de filtros directShow
[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 esta sección se proporciona un breve resumen de las tareas implicadas en el desarrollo de un filtro DirectShow personalizado. También proporciona vínculos a temas que describen estas tareas con mayor detalle. Antes de leer esta sección, lea los temas de Acerca de DirectShow, que describen la arquitectura general de DirectShow.
Biblioteca de clases base de DirectShow
El SDK de DirectShow incluye un conjunto de clases de C++ para escribir filtros. Aunque no son necesarias, estas clases son la manera recomendada de escribir un nuevo filtro. Para usar las clases base, compárelas en una biblioteca estática y vincule el archivo .lib al proyecto, como se describe en Creación de filtros DirectShow.
La biblioteca de clases base define una clase raíz para los filtros, la clase CBaseFilter . Otras clases derivan de CBaseFilter y están especializadas para determinados tipos de filtros. Por ejemplo, la clase CTransformFilter está diseñada para filtros de transformación. Para crear un nuevo filtro, implemente una clase que herede de una de las clases de filtro. Por ejemplo, la declaración de clase podría ser la siguiente:
class CMyFilter : public CTransformFilter
{
private:
/* Declare variables and methods that are specific to your filter.
public:
/* Override various methods in CTransformFilter */
};
Para obtener más información sobre las clases base de DirectShow, vea los temas siguientes:
Crear patillas
Un filtro debe crear una o varias patillas. El número de patillas se puede corregir en tiempo de diseño o el filtro puede crear nuevos pines según sea necesario. Por lo general, los pin derivan de la clase CBasePin o de una clase que hereda CBasePin, como CBaseInputPin. Las patillas del filtro deben declararse como variables miembro en la clase de filtro. Algunas de las clases de filtro ya definen las patillas, pero si el filtro hereda directamente de CBaseFilter, debe declarar las patillas en la clase derivada.
Negociación de conexiones de patillas
Cuando el Administrador de gráficos de filtros intenta conectar dos filtros, las patillas deben estar de acuerdo con varias cosas. Si no lo pueden, se produce un error en el intento de conexión. Por lo general, las patillas negocian lo siguiente:
- Transport. El transporte es el mecanismo que usarán los filtros para mover muestras multimedia del pin de salida al pin de entrada. Por ejemplo, pueden usar la interfaz IMemInputPin ("modelo de inserción") o la interfaz IAsyncReader ("modelo de extracción").
- Tipo de medio. Casi todas las patillas usan tipos de medios para describir el formato de los datos que entregarán.
- Asignador. El asignador es el objeto que crea los búferes que contienen los datos. Los pines deben aceptar qué patilla proporcionará el asignador. También deben acordar el tamaño de los búferes, el número de búferes que se van a crear y otras propiedades del búfer.
Las clases base implementan un marco para estas negociaciones. Debe completar los detalles reemplazando varios métodos en la clase base. El conjunto de métodos que debe invalidar depende de la clase y de la funcionalidad del filtro. Para obtener más información, consulte Conexión de filtros.
Procesamiento y entrega de datos
La función principal de la mayoría de los filtros es procesar y entregar datos multimedia. La forma en que se produce depende del tipo de filtro:
- Un origen de inserción tiene un subproceso de trabajo que rellena continuamente muestras con datos y los entrega de bajada.
- Un origen de extracción espera a que su vecino de bajada solicite un ejemplo. Responde escribiendo datos en un ejemplo y entregando el ejemplo al filtro de bajada. El filtro de bajada crea el subproceso que controla el flujo de datos.
- Un filtro de transformación tiene muestras entregadas por su vecino ascendente. Cuando recibe un ejemplo, procesa los datos y los entrega de bajada.
- Un filtro de representador recibe muestras de nivel superior y las programa para su representación en función de las marcas de tiempo.
Otras tareas relacionadas con el streaming incluyen el vaciado de datos del grafo, el control del final de la secuencia y la respuesta a las solicitudes de búsqueda. Para obtener más información sobre estos problemas, vea los temas siguientes:
- Data Flow para desarrolladores de filtros
- Administración de control de calidad
- Subprocesos y secciones críticas
Compatibilidad con COM
Los filtros DirectShow son objetos COM, normalmente empaquetados en archivos DLL. La biblioteca de clases base implementa un marco para admitir COM. Se describe en la sección DirectShow y COM.
Temas relacionados