DirectShow是微软提供的视频播放SDK,本文介绍了如果在MFC应用程序中使用[DShow]来播放视频
#include <DShow.h> // DirectShow头文件
需要在工程里面添加该头文件,然后定义个4个指针。
IGraphBuilder* m_pGraphBuilder;
IMediaControl* m_pMediaControl;
IMediaSeeking* m_pMediaSeeking;
IMediaEventEx* m_pMediaEventEx;
// 创建GraphBuilder实例
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder,
(void**)&m_pGraphBuilder);
// 通过该实例获取Media控制、Media定位、Media事件接口
hr = m_pGraphBuilder->QueryInterface(IID_IMediaControl, (void**)&m_pMediaControl);
hr = m_pGraphBuilder->QueryInterface(IID_IMediaSeeking, (void**)&m_pMediaSeeking);
hr = m_pGraphBuilder->QueryInterface(IID_IMediaEventEx, (void**)&m_pMediaEventEx);
// 设置消息通知窗体
m_pMediaEventEx->SetNotifyWindow((OAHWND)(pWnd->GetSafeHwnd()), WM_GRAPHNOTIFY, 0);
#define WM_GRAPHNOTIFY (WM_USER + 13)
WM_GRAPHNOTIFY 是自定义的,最后DShow会以该消息通知窗体
在消息接收窗体的BOOL CMFCPlayerDlg::PreTranslateMessage(MSG* pMsg)函数中,查询具体消息
BOOL CMFCPlayerDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_GRAPHNOTIFY)
{
long evCode, param1, param2;
if (m_pMediaEventEx)
{
m_pMediaEventEx->GetEvent(&evCode, ¶m1, ¶m2, 0); // 获取西澳西
switch(evCode)
{
case EC_COMPLETE:
break;
default:
break;
}
m_pMediaEventEx->FreeEventParams(evCode, param1, param2);
}
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
// 设置播放文件
m_pGraphBuilder->RenderFile(strFilePath, NULL);
m_pMediaSeeking->GetDuration(&lDuration); // 获取文件持续时间
m_pMediaControl->Run(); // 开始播放
这个工程是将codeproject上的DPlayer工程改用MFC实现,为了简单演示如何使用DShow播放视频。
流程为: 创建DShow GraphBuilder接口->创建3个Media接口->设置事件通知窗体->设置播放文件并获取文件持续时间
->播放
工程: https://files.cnblogs.com/ityujian/MFCPlayer.zip