Partager via


É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 :

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.

Lecture audio/vidéo dans DirectShow

Utilisation du convertisseur de mixage vidéo

Rendu vidéo