步骤 1:声明 DShowPlayer 类
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media 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 和派生类。
相关主题