步骤 1:声明 DShowPlayer 类

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

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

在本教程中 DShowPlayer , 类管理所有 DirectShow 功能。 此类声明为 folows。

#include <new>
#include <windows.h>
#include <dshow.h>


enum PlaybackState
{
    STATE_NO_GRAPH,
    STATE_RUNNING,
    STATE_PAUSED,
    STATE_STOPPED,
};

const UINT WM_GRAPH_EVENT = WM_APP + 1;

typedef void (CALLBACK *GraphEventFN)(HWND hwnd, long eventCode, LONG_PTR param1, LONG_PTR param2);

class DShowPlayer
{
public:
    DShowPlayer(HWND hwnd);
    ~DShowPlayer();

    PlaybackState State() const { return m_state; }

    HRESULT OpenFile(PCWSTR pszFileName);
    
    HRESULT Play();
    HRESULT Pause();
    HRESULT Stop();

    BOOL    HasVideo() const;
    HRESULT UpdateVideoWindow(const LPRECT prc);
    HRESULT Repaint(HDC hdc);
    HRESULT DisplayModeChanged();

    HRESULT HandleGraphEvent(GraphEventFN pfnOnGraphEvent);

private:
    HRESULT InitializeGraph();
    void    TearDownGraph();
    HRESULT CreateVideoRenderer();
    HRESULT RenderStreams(IBaseFilter *pSource);

    PlaybackState   m_state;

    HWND m_hwnd; // Video window. This window also receives graph events.

    IGraphBuilder   *m_pGraph;
    IMediaControl   *m_pControl;
    IMediaEventEx   *m_pEvent;
    CVideoRenderer  *m_pVideo;
};

注意:

  • PlaybackState枚举描述 对象的当前状态DShowPlayer
  • 常量WM_GRAPH_EVENT定义专用窗口消息。 此消息用于通知应用程序筛选器图事件。 请参阅 步骤 6:处理图形事件
  • GraphEventFN 是指向用于处理筛选器图事件的回调函数的指针。 应用程序实现此回调函数。
  • m_pVideo 成员变量为各种 DirectShow 视频呈现器提供包装器。 请参阅 步骤 2:声明 CVideoRenderer 和派生类
  • 在本教程中, SafeRelease 函数用于释放 COM 接口指针。

下一 步:步骤 2:声明 CVideoRenderer 和派生类

DirectShow 中的音频/视频播放