Partilhar via


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:

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.

Reprodução de áudio/vídeo no DirectShow

Usando o Renderizador de Combinação de Vídeo

Renderização de vídeo