zoukankan      html  css  js  c++  java
  • 一个简单的基于 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



  • 相关阅读:
    网络七层
    微信小程序开发工具 常用快捷键
    BZOJ 1026 windy数 (数位DP)
    BZOJ 1026 windy数 (数位DP)
    CodeForces 55D Beautiful numbers (SPOJ JZPEXT 数位DP)
    CodeForces 55D Beautiful numbers (SPOJ JZPEXT 数位DP)
    HDU 3709 Balanced Number (数位DP)
    HDU 3709 Balanced Number (数位DP)
    UVA 11361 Investigating Div-Sum Property (数位DP)
    UVA 11361 Investigating Div-Sum Property (数位DP)
  • 原文地址:https://www.cnblogs.com/leixiaohua1020/p/3902013.html
Copyright © 2011-2022 走看看