步骤 2:声明 CVideoRenderer 和派生类

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

本主题是 DirectShow 中音频/视频播放教程的步骤 2。 主题 DirectShow 播放示例中显示了完整的代码。

DirectShow 提供了几个用于呈现视频的不同筛选器:

有关这些筛选器之间的差异的详细信息,请参阅 选择正确的视频呈现器

在本教程中,以下抽象类用于包装视频呈现器筛选器。

// 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 的 IBaseFilterIMFVideoDisplayControl 接口的指针。

// 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:生成筛选器图

DirectShow 中的音频/视频播放

使用视频混合呈现器

视频渲染