Freigeben über


Schritt 2: Deklarieren von CVideoRenderer und abgeleiteten Klassen

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Dieses Thema ist Schritt 2 des Tutorials Audio/Videowiedergabe in DirectShow. Der vollständige Code wird im Thema DirectShow-Wiedergabebeispiel angezeigt.

DirectShow bietet verschiedene Filter zum Rendern von Videos:

Weitere Informationen zu den Unterschieden zwischen diesen Filtern finden Sie unter Auswählen des richtigen Videorenderers.

In diesem Tutorial wird die folgende abstrakte Klasse verwendet, um den Videorendererfilter umzuschließen.

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

Hinweise:

  • Die HasVideo -Methode gibt TRUE zurück, wenn der Videorenderer erstellt wurde.
  • Die AddToGraph -Methode fügt dem Filtergraphen den Videorenderer hinzu.
  • Die FinalizeGraph -Methode schließt den Diagrammerstellungsschritt ab.
  • Die UpdateVideoWindow -Methode aktualisiert das Videozielrechteck.
  • Die Repaint -Methode zeichnet den aktuellen Videoframe neu.
  • Die DisplayModeChanged -Methode behandelt Änderungen im Anzeigemodus.

Jede dieser Methoden wird weiter unten in diesem Tutorial ausführlich beschrieben.

Deklarieren Sie als Nächstes eine abgeleitete Klasse, um jeden der drei Videorenderer umzuschließen: evr, VMR-9 und VMR-7.

CEVR-Klasse

Die CEVR -Klasse verwaltet den EVR. Sie enthält einen Zeiger auf die IBaseFilter - und IMFVideoDisplayControl-Schnittstellen des 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-Klasse

Die CVMR9 -Klasse verwaltet vmR-9. Sie enthält einen Zeiger auf die IVMRWindowlessControl9-Schnittstelle .

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

Die CVMR7 -Klasse verwaltet die VMR-7. Sie enthält einen Zeiger auf die IVMRWindowlessControl-Schnittstelle .

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

Weiter: Schritt 3: Erstellen des Filtergraphen.

Audio-/Videowiedergabe in DirectShow

Verwenden des Videomischrenderers

Videorendering