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

  • 相关阅读:
    面试题15:链表中倒数第K个节点
    面试题14:调整数组顺序使奇数位于偶数前面
    面试题13:在O(1)时间删除链表节点
    面试题12:打印1到最大的n位数(大数问题)
    面试题11:数值的整数次方
    面试题10:二进制中1的个数
    面试题9:裴波那切数列
    api_request.go
    string_array.go
    logger.go
  • 原文地址:https://www.cnblogs.com/ityujian/p/3043755.html
Copyright © 2011-2022 走看看