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:
- filtro del renderer video avanzato (EVR)
- Filtro del renderer di combinazione video 9 (VMR-9)
- Filtro del renderer di combinazione video 7 (VMR-7)
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.
Argomenti correlati