Étape 2 : Déclarer CVideoRenderer et les classes dérivées
[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]
Cette rubrique est l’étape 2 du didacticiel Lecture audio/vidéo dans DirectShow. Le code complet est présenté dans la rubrique Exemple de lecture DirectShow.
DirectShow fournit plusieurs filtres différents qui restituent la vidéo :
- Filtre de convertisseur vidéo amélioré (EVR)
- Filtre du renderer de mixage vidéo 9 (VMR-9)
- Filtre de convertisseur de mixage vidéo 7 (VMR-7)
Pour plus d’informations sur les différences entre ces filtres, consultez Choisir le convertisseur vidéo approprié.
Dans ce tutoriel, la classe abstraite suivante est utilisée pour encapsuler le filtre du convertisseur vidéo.
// 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;
};
Remarques :
- La
HasVideo
méthode retourne TRUE si le convertisseur vidéo a été créé. - La
AddToGraph
méthode ajoute le convertisseur vidéo au graphique de filtre. - La
FinalizeGraph
méthode termine l’étape de création de graphique. - La
UpdateVideoWindow
méthode met à jour le rectangle de destination de la vidéo. - La
Repaint
méthode redessine l’image vidéo actuelle. - La
DisplayModeChanged
méthode gère les modifications du mode d’affichage.
Chacune de ces méthodes est décrite en détail plus loin dans ce tutoriel.
Ensuite, déclarez une classe dérivée pour encapsuler chacun des trois convertisseurs vidéo : l’EVR, le VMR-9 et le VMR-7.
Classe CEVR
La CEVR
classe gère l’EVR. Il contient un pointeur vers les interfaces IBaseFilter et IMFVideoDisplayControl de l’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, classe
La CVMR9
classe gère le VMR-9. Il contient un pointeur vers l’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();
};
CVMR7, classe
La CVMR7
classe gère le VMR-7. Il contient un pointeur vers l’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();
};
Suivant : Étape 3 : Générer le graphe de filtres.
Rubriques connexes