Etapa 2: Declarar classes CVideoRenderer e Derivadas
[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]
Este tópico é a etapa 2 do tutorial Reprodução de Áudio/Vídeo no DirectShow. O código completo é mostrado no tópico Exemplo de Reprodução do DirectShow.
O DirectShow fornece vários filtros diferentes que renderizam vídeo:
- EVR (Filtro avançado de renderizador de vídeo )
- Filtro do renderizador de combinação de vídeo 9 (VMR-9)
- Filtro do Renderizador de Combinação de Vídeo 7 (VMR-7)
Para obter mais informações sobre as diferenças entre esses filtros, consulte Escolhendo o renderizador de vídeo correto.
Neste tutorial, a classe abstrata a seguir é usada para encapsular o filtro do renderizador 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;
};
Observações:
- O
HasVideo
método retornará TRUE se o renderizador de vídeo tiver sido criado. - O
AddToGraph
método adiciona o renderizador de vídeo ao grafo de filtro. - O
FinalizeGraph
método conclui a etapa de criação de grafo. - O
UpdateVideoWindow
método atualiza o retângulo de destino do vídeo. - O
Repaint
método redesenha o quadro de vídeo atual. - O
DisplayModeChanged
método manipula alterações no modo de exibição.
Cada um desses métodos é descrito em detalhes mais adiante neste tutorial.
Em seguida, declare uma classe derivada para encapsular cada um dos três renderizadores de vídeo: o EVR, o VMR-9 e o VMR-7.
Classe CEVR
A CEVR
classe gerencia o EVR. Ele contém um ponteiro para as interfaces IBaseFilter e IMFVideoDisplayControl do 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();
};
Classe CVMR9
A CVMR9
classe gerencia a VMR-9. Ele contém um ponteiro para a interface 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();
};
Classe CVMR7
A CVMR7
classe gerencia a VMR-7. Ele contém um ponteiro para a interface 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();
};
Próximo: Etapa 3: criar o grafo de filtro.
Tópicos relacionados