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:
- Erweiterter Videorenderer-Filter (EVR)
- Rendererfilter für Videomischung 9 (VMR-9)
- Videomischungs-Rendererfilter 7 (VMR-7)
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.
Zugehörige Themen