Paso 2: Declarar clases CVideoRenderer y derivadas
[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.
Este tema es el paso 2 del tutorial Reproducción de audio y vídeo en DirectShow. El código completo se muestra en el tema Ejemplo de reproducción de DirectShow.
DirectShow proporciona varios filtros diferentes que representan vídeo:
- Filtro de representador de vídeo mejorado (EVR)
- Filtro de representador de mezcla de vídeo 9 (VMR-9)
- Filtro de representador de mezcla de vídeos 7 (VMR-7)
Para obtener más información sobre las diferencias entre estos filtros, consulte Elección del representador de vídeo correcto.
En este tutorial, se usa la siguiente clase abstracta para ajustar el filtro del representador de vídeo.
// Abstract class to manage the video renderer filter.
// Specific implementations handle the VMR-7, VMR-9, or EVR filter.
class CVideoRenderer
{
public:
virtual ~CVideoRenderer() {};
virtual BOOL HasVideo() const = 0;
virtual HRESULT AddToGraph(IGraphBuilder *pGraph, HWND hwnd) = 0;
virtual HRESULT FinalizeGraph(IGraphBuilder *pGraph) = 0;
virtual HRESULT UpdateVideoWindow(HWND hwnd, const LPRECT prc) = 0;
virtual HRESULT Repaint(HWND hwnd, HDC hdc) = 0;
virtual HRESULT DisplayModeChanged() = 0;
};
Notas:
- El
HasVideo
método devuelve TRUE si se ha creado el representador de vídeo. - El
AddToGraph
método agrega el representador de vídeo al gráfico de filtro. - El
FinalizeGraph
método completa el paso de creación de grafos. - El
UpdateVideoWindow
método actualiza el rectángulo de destino de vídeo. - El
Repaint
método vuelve a dibujar el fotograma de vídeo actual. - El
DisplayModeChanged
método controla los cambios en el modo de presentación.
Cada uno de estos métodos se describe en detalle más adelante en este tutorial.
A continuación, declare una clase derivada para encapsular cada uno de los tres representadores de vídeo: EVR, VMR-9 y VMR-7.
CEVR (clase)
La CEVR
clase administra el EVR. Contiene un puntero a las interfaces IBaseFilter y IMFVideoDisplayControl de la EVR.
// Manages the EVR video renderer filter.
class CEVR : public CVideoRenderer
{
IBaseFilter *m_pEVR;
IMFVideoDisplayControl *m_pVideoDisplay;
public:
CEVR();
~CEVR();
BOOL HasVideo() const;
HRESULT AddToGraph(IGraphBuilder *pGraph, HWND hwnd);
HRESULT FinalizeGraph(IGraphBuilder *pGraph);
HRESULT UpdateVideoWindow(HWND hwnd, const LPRECT prc);
HRESULT Repaint(HWND hwnd, HDC hdc);
HRESULT DisplayModeChanged();
};
CVMR9 (clase)
La CVMR9
clase administra VMR-9. Contiene un puntero a la interfaz IVMRWindowlessControl9 .
// Manages the VMR-9 video renderer filter.
class CVMR9 : public CVideoRenderer
{
IVMRWindowlessControl9 *m_pWindowless;
public:
CVMR9();
~CVMR9();
BOOL HasVideo() const;
HRESULT AddToGraph(IGraphBuilder *pGraph, HWND hwnd);
HRESULT FinalizeGraph(IGraphBuilder *pGraph);
HRESULT UpdateVideoWindow(HWND hwnd, const LPRECT prc);
HRESULT Repaint(HWND hwnd, HDC hdc);
HRESULT DisplayModeChanged();
};
CVMR7 (clase)
La CVMR7
clase administra VMR-7. Contiene un puntero a la interfaz IVMRWindowlessControl .
// Manages the VMR-7 video renderer filter.
class CVMR7 : public CVideoRenderer
{
IVMRWindowlessControl *m_pWindowless;
public:
CVMR7();
~CVMR7();
BOOL HasVideo() const;
HRESULT AddToGraph(IGraphBuilder *pGraph, HWND hwnd);
HRESULT FinalizeGraph(IGraphBuilder *pGraph);
HRESULT UpdateVideoWindow(HWND hwnd, const LPRECT prc);
HRESULT Repaint(HWND hwnd, HDC hdc);
HRESULT DisplayModeChanged();
};
Siguiente: Paso 3: Compilar el grafo de filtro.
Temas relacionados