代码改变世界

[MFC][DShow]简单例子

2013-04-25 23:08  鉴于  阅读(593)  评论(0编辑  收藏  举报

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, &param1, &param2, 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