Condividi tramite


Passaggio 2: Dichiarare le classi CVideoRenderer e derivate

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEnginee Acquisizione Audio/Video in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente di utilizzare il nuovo codice MediaPlayer, IMFMediaEngine e acquisizione Audio/Video in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Questo argomento è il passaggio 2 dell'esercitazione Riproduzione Audio/Video in DirectShow. Il codice completo è illustrato nell'argomento Esempio di riproduzione DirectShow.

DirectShow offre diversi filtri che eseguono il rendering del video:

Per altre informazioni sulle differenze tra questi filtri, vedere Scelta del renderer video corretto.

In questa esercitazione viene usata la classe astratta seguente per eseguire il wrapping del filtro del renderer video.

// 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;
};

Note:

  • Il metodo HasVideo restituisce TRUE se è stato creato il renderer video.
  • Il metodo AddToGraph aggiunge il renderer video al grafico del filtro.
  • Il metodo FinalizeGraph completa il passaggio di compilazione del grafo.
  • Il metodo UpdateVideoWindow aggiorna il rettangolo di destinazione video.
  • Il metodo Repaint ridisegna il fotogramma video corrente.
  • Il metodo DisplayModeChanged gestisce le modifiche in modalità schermo.

Ognuno di questi metodi è descritto in dettaglio più avanti in questa esercitazione.

Successivamente, dichiarare una classe derivata per eseguire il wrapping di ognuno dei tre renderer video: EVR, VMR-9 e VMR-7.

Classe CEVR

La classe CEVR gestisce l'EVR. Contiene un puntatore alle interfacceIBaseFiltere IMFVideoDisplayControl dell'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

La classe CVMR9 gestisce VMR-9. Contiene un puntatore all'interfacciaIVMRWindowlessControl9.

// 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

La classe CVMR7 gestisce il VMR-7. Contiene un puntatore all'interfaccia 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();
};

Avanti: Passaggio 3: Compilare il grafico del filtro.

Riproduzione audio/video in DirectShow

Uso del renderer di combinazione video

rendering video