一个简单的基于 DirectShow 的播放器 2(对话框类)
上篇文章分析了一个封装DirectShow各种接口的封装类(CDXGraph):一个简单的基于 DirectShow 的播放器 1(封装类)
本文继续上篇文章,分析一下调用这个封装类(CDXGraph)的对话框类(CSimplePlayerDlg),看看在MFC中如何使用这个类(CDXGraph)。
首先来看看CSimplePlayerDlg这个类的定义,瞧瞧SimplePlayerDlg.h这个头文件。
/* 雷霄骅 * 中国传媒大学/数字电视技术 * leixiaohua1020@126.com * */ // SimplePlayerDlg.h : header file // #if !defined(AFX_SIMPLEPLAYERDLG_H__3599FE35_3322_4CC7_B30B_6D6050C2EDFF__INCLUDED_) #define AFX_SIMPLEPLAYERDLG_H__3599FE35_3322_4CC7_B30B_6D6050C2EDFF__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 ///////////////////////////////////////////////////////////////////////////// // CSimplePlayerDlg dialog #include <streams.h> #include "CDXGraph.h" #define SLIDER_TIMER 100 class CSimplePlayerDlg : public CDialog { // Construction public: CSimplePlayerDlg(CWnd* pParent = NULL); // standard constructor ~CSimplePlayerDlg(); // Dialog Data //{{AFX_DATA(CSimplePlayerDlg) enum { IDD = IDD_SIMPLEPLAYER_DIALOG }; CSliderCtrl mSliderGraph; CStatic mVideoWindow; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CSimplePlayerDlg) public: virtual BOOL PreTranslateMessage(MSG* pMsg); virtual BOOL DestroyWindow(); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: HICON m_hIcon; CDXGraph * mFilterGraph; // Filter Graph封装 CString mSourceFile; // 源文件 UINT mSliderTimer; // 定时器ID //创建Graph void CreateGraph(void); // 创建Filter Graph void DestroyGraph(void); // 析构Filter Graph void RestoreFromFullScreen(void); // Just for testing... HRESULT FindFilterByInterface(REFIID riid, IBaseFilter** ppFilter); void ShowVRPropertyPage(void); // Generated message map functions //{{AFX_MSG(CSimplePlayerDlg) virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); //打开 afx_msg void OnButtonOpen(); //播放 afx_msg void OnButtonPlay(); //暂停 afx_msg void OnButtonPause(); //停止 afx_msg void OnButtonStop(); afx_msg void OnButtonGrab(); afx_msg void OnButtonFullscreen(); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); afx_msg void OnButtonTest(); //}}AFX_MSG afx_msg LRESULT OnGraphNotify(WPARAM inWParam, LPARAM inLParam); DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_SIMPLEPLAYERDLG_H__3599FE35_3322_4CC7_B30B_6D6050C2EDFF__INCLUDED_)
从头文件来看,和普通的MFC对话框类并没有什么不同,无非是一些消息响应函数,或者MFC控件对应的类。需要注意一下,有一个变量:
CDXGraph * mFilterGraph
接下来看看CSimplePlayerDlg函数的实现部分吧。
OnButtonOpen():打开媒体文件按钮的响应函数
//打开 void CSimplePlayerDlg::OnButtonOpen() { // TODO: Add your control notification handler code here CString strFilter = "AVI File (*.avi)|*.avi|"; strFilter += "MPEG File (*.mpg;*.mpeg)|*.mpg;*.mpeg|"; strFilter += "Mp3 File (*.mp3)|*.mp3|"; strFilter += "Wave File (*.wav)|*.wav|"; strFilter += "All Files (*.*)|*.*|"; CFileDialog dlgOpen(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, strFilter, this); if (IDOK == dlgOpen.DoModal()) { mSourceFile = dlgOpen.GetPathName(); // Rebuild the file playback filter graph //创建Graph CreateGraph(); } }
其中CreateGraph()函数如下所示:
//创建Graph void CSimplePlayerDlg::CreateGraph(void) { //(如果有)销毁Graph DestroyGraph(); //新建一个核心类 mFilterGraph = new CDXGraph(); if (mFilterGraph->Create()) { // Render the source clip mFilterGraph->RenderFile(mSourceFile); // Set video window and notification window mFilterGraph->SetDisplayWindow(mVideoWindow.GetSafeHwnd()); mFilterGraph->SetNotifyWindow(this->GetSafeHwnd()); // Show the first frame mFilterGraph->Pause(); } }
与CreateGraph()相反的还有一个DestroyGraph()
//(如果有)销毁Graph void CSimplePlayerDlg::DestroyGraph(void) { if (mFilterGraph) { // Stop the filter graph first mFilterGraph->Stop(); mFilterGraph->SetNotifyWindow(NULL); delete mFilterGraph; mFilterGraph = NULL; } }
OnButtonPlay():播放按钮的响应函数
//播放 void CSimplePlayerDlg::OnButtonPlay() { if (mFilterGraph) { mFilterGraph->Run(); // Start a timer if (mSliderTimer == 0) { mSliderTimer = SetTimer(SLIDER_TIMER, 100, NULL); } } }
OnButtonPause():暂停按钮的响应函数
void CSimplePlayerDlg::OnButtonPause() { if (mFilterGraph) { mFilterGraph->Pause(); // Start a timer if (mSliderTimer == 0) { mSliderTimer = SetTimer(SLIDER_TIMER, 100, NULL); } } }
OnButtonStop():停止按钮的响应函数
void CSimplePlayerDlg::OnButtonStop() { if (mFilterGraph) { mFilterGraph->SetCurrentPosition(0); mFilterGraph->Stop(); // Stop the timer if (mSliderTimer) { KillTimer(mSliderTimer); mSliderTimer = 0; } } }
其他的函数不再一一列举,但意思都是一样的。
播放器源代码下载:http://download.csdn.net/detail/leixiaohua1020/6453467
一个简单的基于 DirectShow 的播放器 2(对话框类)的更多相关文章
- 一个简单的基于 DirectShow 的播放器 1(封装类)
DirectShow最主要的功能就是播放视频,在这里介绍一个简单的基于DirectShow的播放器的例子,是用MFC做的,今后有机会可以基于该播放器开发更复杂的播放器软件. 注:该例子取自于<D ...
- 转:最简单的基于 DirectShow 的视频播放器
50行代码实现的一个最简单的基于 DirectShow 的视频播放器 本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectSho ...
- 50行代码实现的一个最简单的基于 DirectShow 的视频播放器
本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectShow 播放视频所有必备的函数. 直接贴上代码,具体代码的含义都写在注释中 ...
- 一个简单有趣的Python音乐播放器
(赠新手,老鸟绕行0.0) Python版本:3.5.2 源码如下: __Author__ = "Lance#" # -*- coding = utf-8 -*- #导入相应模块 ...
- 自己实现一个简单的网络音乐mp3播放器
大繁至简,把思路搞清楚才是最重要的,如何去做依托于使用什么来实现这项功能 列出我使用的基本类 NSURLSessionDataTask 数据获取类 NSFileHandle 数据缓存和数据读取类 Au ...
- 最简单的基于DirectShow的示例:视频播放器自定义版
===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...
- 最简单的基于DirectShow的示例:视频播放器图形界面版
===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...
- 最简单的基于DirectShow的示例:视频播放器
===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...
- 最简单的基于DirectShow的示例:获取Filter信息
===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...
随机推荐
- 剑指Offer——算法复杂度中的O(logN)底数是多少
剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...
- 6. React 表单使用介绍
表单是前端页面中非常重要也是非常常用的一个内容,react 也在表单方面进行了很多封装,让开发者可以方便快捷地在 react 组件中使用表单.下面介绍如何在组件中正确的使用表单,从而可 ...
- 深入剖析Tomcat类加载机制
1JVM类加载机制 JVM的ClassLoader通过Parent属性定义父子关系,可以形成树状结构.其中引导类.扩展类.系统类三个加载器是JVM内置的. 它们的作用分别是: 1)引导类加载器:使用n ...
- CONFIGURE ADFS 3.0 WITH SHAREPOINT 2013
http://blogit.create.pt/miguelmoreno/2014/11/14/configure-adfs-3-0-with-sharepoint-2013/
- oralce 查看是否启动 登陆 创建用户 常用命令小记
最简单看进程有没有: ps -ef | grep ora 其次用oracle的的命令查看,比如: su - oracle sqlplus / as sysdba 看能连进数据库不. 创建用户和表空间: ...
- Douglas Adams - 3 Rules That Describe Our Reactions To Technologies 科技影响生活的三个规律
文章摘自http://highscalability.com/. 这个博客是大家都应该订阅的.原文地址http://highscalability.com/blog/2014/3/11/douglas ...
- 【Unity技巧】自定义消息框(弹出框)
写在前面 这一篇我个人认为还是很常用的,一开始也是实习的时候学到的,所以我觉得实习真的是一个快速学习工程技巧的途径. 提醒:这篇教程比较复杂,如果你不熟悉NGUI.iTween.C#的回调函数机制,那 ...
- 盘点:2016中国百强地产CIO高峰论坛的8大看点
2016年中国百强地产CIO高峰论坛将于2016年6月16日至18日在浙江湖州举行,届时百余位地产公司CIO将出席大会,共同探讨新形势下如何重塑IT价值,增强地产公司的市场竞争力和盈利能力. 此次大会 ...
- 今天我成为了CSDN博客专家
刚刚收到了来自CSDN的回复,正如我的期待: 我随即回到自己的博客页面,欣喜地看到"专家"勋章被点亮了.Oh, yeah~ Q:我为什么要申请这个"专家"称号? ...
- shell脚本整段注释
摘自:http://zhidao.baidu.com/link?url=XmCCZmfluRe6n8TjPRKJTx4GGOUPSGX1VNBm-euqGdpKGpveTESxC0HL90UBNT5n ...