步骤 2:声明 CVideoRenderer 和派生类
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
本主题是 DirectShow 中音频/视频播放教程的步骤 2。 主题 DirectShow 播放示例中显示了完整的代码。
DirectShow 提供了几个用于呈现视频的不同筛选器:
- 增强的视频呈现器筛选器 (EVR)
- 视频混合呈现器筛选器 9 (VMR-9)
- 视频混合呈现器筛选器 7 (VMR-7)
有关这些筛选器之间的差异的详细信息,请参阅 选择正确的视频呈现器。
在本教程中,以下抽象类用于包装视频呈现器筛选器。
// 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;
};
注意:
- 如果已创建视频呈现器,方法
HasVideo
将返回 TRUE 。 - 方法
AddToGraph
将视频呈现器添加到筛选器图。 - 方法
FinalizeGraph
完成图形生成步骤。 - 方法
UpdateVideoWindow
更新视频目标矩形。 - 方法
Repaint
重绘当前视频帧。 - 方法
DisplayModeChanged
处理显示模式更改。
本教程稍后将详细介绍其中每种方法。
接下来,声明一个派生类以包装三个视频呈现器中的每一个:EVR、VMR-9 和 VMR-7。
CEVR 类
类 CEVR
管理 EVR。 它包含指向 EVR 的 IBaseFilter 和 IMFVideoDisplayControl 接口的指针。
// 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 类
类 CVMR9
管理 VMR-9。 它包含指向 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 类
类 CVMR7
管理 VMR-7。 它包含指向 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();
};
下一 步:步骤 3:生成筛选器图。
相关主题