zoukankan      html  css  js  c++  java
  • [MFC][DShow]简单例子

    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

  • 相关阅读:
    ES6和Node.js的import和export
    重写Router.prototype.push后还报NavigationDuplicated错误的解决方法
    nightwatch对前端做自动化测试
    使用video.js 7在html中播放rtmp视频流
    UEFI开发环境搭建
    类的静态成员
    const成员函数
    类和结构
    最长递增子序列
    C语言将十六进制字符串转化成十六进制
  • 原文地址:https://www.cnblogs.com/ityujian/p/3043755.html
Copyright © 2011-2022 走看看