首页 理论教育 数字视频播放器实例:基于CDigitalVideo类的实现

数字视频播放器实例:基于CDigitalVideo类的实现

时间:2023-11-16 理论教育 版权反馈
【摘要】:在7.3.1和7.3.2小节中设计并实现了一个可重用的视频操作基本类CDigitalVideo,本节将在此基础上,完成一个数字视频播放器的应用程序实例。图7-5信息查询对话框表7-6控件映射成员变量对应表3. 视频播放器的功能实现添加含有CDigitalVideo类的文件到工程中。应用程序的功能函数需要用到7.3.1和7.3.2小节设计和实现的CDigitalVideo类成员函数。在ClassView视图中点击右键,把已经含有CDigitalVideo类的.cpp 文件和.h文件添加到工程中。并在VideoPlayDlg类的头文件添加该类的声明。

数字视频播放器实例:基于CDigitalVideo类的实现

在7.3.1和7.3.2小节中设计并实现了一个可重用的视频操作基本类CDigitalVideo,本节将在此基础上,完成一个数字视频播放器的应用程序实例。

1. 创建应用程序框架

创建应用程序框架主要工作由Visual Studio来完成。步骤如下:

(1)打开Visual Studio,选择File菜单下的New命令,出现新建工程对话框。选择Project页,选择MFC AppWizard (exe)作为工程的类型,在右边输入工程名VideoPlay,并选择工程位置。然后单击OK进入下一步。

(2)在向导首页STEP 1对话框中,设置应用程序类型为基于对话框类型(Dialog based),如图7-1所示,单击“Finish”按钮完成工程设置。

(3)添加库文件。

我们选择Project菜单下的Settings菜单项,或直接使用快捷键Alt+F7,弹出7-2图所示的Project Setting对话框。在该对话框中选择Link页面,在Object/Library Modules的编辑框中输入winmm.lib,然后单击OK按钮,winmm.lib库便链接到工程中。

2. 应用程序界面设计

(1)主对话框的设计。

① 设计好的主对话框界面如图7-3所示。

图7-1 创建应用程序框架

图7-2 添加库文件

图7-3 主对话框界面

② 设置控件属性。

主对话框的按钮和各控件的属性设置参见表7-4。

表7-4 主对话框控件属性设置

把图片框(Picture)的属性的类型设为Rectangle、颜色设为黑色(Black),并选中Visible选项,其它的按钮缺省给定。编辑框的边设置为具有客户边(Client edge)。

③ 为主对话框添加变量

按Ctrl+W,或直接从View菜单上选ClassWizard菜单项进入MFC ClassWizard窗口,Visual Studio在创建工程时就已经为我们添加了一个CDialog类的派生类CVideoPlayDlg,我们的工作简化为只要在MFC ClassWizard窗口的类成员变量(Member Viables)页中给Scroll Bar添加一个变量m_ScrollBar即可。添加方式如图7-4所示。

图7-4 添加成员变量

(2)信息查询对话框的设计。

① 从资源窗口中添加一个新对话框IDD_DISPLAY,对话框标题为“信息查询”,该对话框主要功能是显示视频播放信息。信息显示对话框的界面如图7-5所示。

② 设置控件属性。

信息查询对话框的各个控件的属性见表7-5。

表7-5 信息对话框控件的属性设置

③ 为信息查询对话框添加一个新类。

强大的Visual studio不需要我们为添加一个新类浪费很多时间去编写代码,只需要一些简单的鼠标操作就可以完成我们需要的一切。首先选择“View”菜单下的“ClassWizard”菜单项,或直接按Ctrl +W键。在弹出的对话框中选择New Class。在Name 编辑框中输入CInfoDlg,Base class设为CDialog;Dialog ID选择IDD_DISPLAY,然后点击OK按钮,Visual C++便会自动生成一个新类CInfoDlg。Visual C++在生成类之后会产生两个文件“InfoDlg.h”和“InfoDlg.cpp”,并自动加入到工程中。

④ 为信息查询对话框映射成员变量。

每个编辑框控件所映射的成员变量见表7-6。

图7-5 信息查询对话框

表7-6 控件映射成员变量对应表

3. 视频播放器的功能实现

(1)添加含有CDigitalVideo类的文件到工程中。

应用程序的功能函数需要用到7.3.1和7.3.2小节设计和实现的CDigitalVideo类成员函数。所以需要将CDigitalVideo类添加到工程中。在ClassView视图中点击右键,把已经含有CDigitalVideo类的.cpp 文件和.h文件添加到工程中。并在VideoPlayDlg类的头文件添加该类的声明。

我们的工程以对话框为基础,几乎所有的工作都集中在为对话框中的控件添加消息函数。在添加消息函数之前,我们必须做一些准备工作。 在把CDigitalVideo类文件添加到工程之后,需要在VideoPlayDlg.cpp文件的开始添加#include “DigitalVideo.h”语句,VideoPlayDlg.cpp文件需要包含的文件如下:

(2)为CVideoPlayDlg类添加成员变量。

类的下面几个成员变量记录了每个类对象所存储的一些信息,m_hIcon用来记录该程序使用的图标句柄;m_Video是一个CDigitalVideo类的对象,大部分对成员变量的操作都集中在该类的成员函数中;m_bOpen用来记录多媒体设备的打开状态;m_bSound这个成员在视频播放中没有用到,是记录声音状态的参数;m_bLoop记录多媒体设备是否是以循环的方式播放;m_bFullScreen记录多媒体设备是否是以全屏的方式播放;m_strFileName是一个CString类型的变量,用来记录播放的视频文件名称。

(3)为主对话框的每个按钮添加消息函数。

在实现编程的开始,我们必须了解在程序中该干什么,要实现什么样的功能,这就是我们所说的功能设计。在本章讨论的对于多媒体的应用,需要的功能可以完全和主对话框对应起来。为了简单起见,表7-7列出了主对话框的每个按钮所对应的消息函数名称及其功能。

表7-7 消息函数表

有了上述函数还不够,我们需要一个时钟来控制视频播放时对屏幕的刷新速度。OnTime()函数就是为了这一目的设计的,通过该函数,可以每隔一定的时间,如一秒,对播放视频的窗口进行一次刷新,保证视频在窗口连续地显示。

(4)实现消息函数。

首先为每个按钮添加消息函数,最简单的添加按钮消息函数的方法是双击按钮,进入MFC的 ClassWizard,选择Message窗口下选择WM_LBUTTONDOWN,再点击Add Function键即可,OnTime()消息函数的添加只需要在Message窗口下选择WM_TIMER即可。生成的消息函数都自动地加入到VideoPlayDlg.cpp文件中。

① 类的构造函数。

该函数在构造对象是被调用,该函数必须对类对象的成员变量进行初始化工作。该函数的实现见程序清单7-19。

程序清单7-19 CVideoPlayDlg:: CVideoPlayDlg()函数

AfxGetApp()函数得到的是该应用程序的句柄,指向CWinApp对象,m_hIcon =AfxGetApp()->LoadIcon(IDR_MAINFRAME);语句表示m_hIcon被赋予指向ID号为IDR_MAINFRAME的图标句柄。

② OnInitDialog函数。

在创建的对话框应用程序框架的一开始就首先调用该函数,所以适合在该函数中完成对对话框的初始化工作。具体工作包括初始化滚动条,把滚动条的范围设置为1~100,滚动条的初始位置在最左边,即第1位,m_ScrollBar类型为CScrollBar。SetIcon(m_hIcon, TRUE)表示把图标m_hIcon指定为32×32个像素大小,即所谓的大图标,而SetIcon(m_hIcon, FALSE)表示把图标m_hIcon指定为16×16个像素大小,即小图标。SetTime(1, 100, NULL)是对时钟进行设置。1表示时钟的标号;100表示每100毫秒发送一次WM_TIME消息给应用程序框架;NULL表示WM_TIME消息被放置在应用程序的队列。OnInitDialog()函数的实现见程序清单7-20。

程序清单7-20 CVideoPlay:: OnInitDialog()函数(www.xing528.com)

③ OnOpen()函数。

该函数实现打开视频的操作。在该函数的开始,必须检查m_bOpen的值,如果此时的应用程序已经打开一个视频设备,我们必须提醒用户应该先关闭已经打开的视频文件。

CFileDialog fileDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, Filter)语句用来创建一个文件选择对话框,通过该对话框可以选择要播放的视频文件。

CWnd *pWnd = GetDlgItem(IDC_VIDEOBOX)语句的主要功能是得到播放视频的控件窗口指针。语句pWnd->GetWindowRect(rect)将播放视频的控件窗口大小赋给rect。

m_Video.Open(fileDlg.GetPathName(), pWnd, 0, 0, rect.Width(), rect.Height()))语句调用m_Video对象的Open()函数,并保证视频刚好能填满播放视频控件窗口,其中的rect.With(),rect.Height()用来获得窗口的宽度和高度。参数0,0表示视频播放窗口的左上角的位置为控件的左上角。

如果打开成功,便把打开的视频文件的路径和文件名放在m_str字符串中,并设置视频播放的速率为每分钟1000帧,m_bOpen标识设为TRUE。

OnOpen()函数的实现见程序清单7-21。

程序清单7-21 CVideoPlayDlg::OnOpen ()函数

④ OnStop()函数、OnPause()函数和OnPlay()函数。

三个函数可以直接用到CDigitalVideo类的成员函数,实现起来比较简单。OnStop()函数、OnPause()函数和OnPlay()函数的实现见程序清单7-22。

程序清单7-22 CVideoPlayDlg::OnStop()、OnPause()和OnPlay()函数

⑤ OnNext()和OnPrev()函数。

两个函数的主要功能,使视频播放的位置往前或往后移动一帧并继续播放。由于在播放过程中,滑块所处的位置和此时播放的当前帧与总帧数相对值一致,所以当前滑块的位置乘以100再除以总帧数。

OnNext()函数的实现见程序清单7-23。

程序清单7-23 CVideoPlayDlg::OnNext()函数

OnPrev ()函数的实现见程序清单7-24。

程序清单7-24 CVideoPlayDlg::OnPrev()函数

⑥ OnTimer()函数。

每隔100ms,该函数就会被调用一次。对于一个视频,如果开始了播放,它会按照既定的速度进行显示。但在打开一个视频后还需要对其进行进一步操作,视频在播放时不会发出消息的,只有通过OnTimer()函数,每隔一定的时间检查一次视频的播放的状态,然后才可以针对视频的状态,对滑块显示当前帧数窗口进行更新,并确定此时每个按钮的状态。具体多长时间更新一次需要综合考虑。OnTimer()函数的实现见程序清单7-25。

注意:每次调用该函数体,都要对显示当前帧窗口更新刷子,设置文本的颜色、背景色,增加了程序的运行时间,建议在程序初始化函数中首先设置,可以增强程序运行效率

程序清单7-25 CVideoPlayDlg::OnTimer()函数

⑦ OnHScroll()函数。

当用户点击对话框上的水平滚动条时,程序将调用OnHScroll函数。该函数包含了所有的滑动块的操作,函数中的nSBCode是滚动条接受到用户发送来的操作指令,nSBCode的取值及其含义如下:

SB_LEFT 滚动到滚动条的开始位置(最左)

SB_ENDSCROLL 滚动到滚动条结束的位置(最右)

SB_LINELEFT 向左(回退)一个位置

SB_LINERIGHT 向右(前进)一个位置

SB_PAGELEFT 向左(回退)一页

SB_PAGERIGHT 向右(前进)一页

SB_THUMBPOSITION 拖动滑动块

如果nSBCode的取值为SB_THUMBPOSITION或SB_THUMBTRACK,nPos指定滑块的位置,否则该参数不起作用,nPos在一定情况下可以取负值。如果滚动消息来自滚动条控件,pScrollBar参数指向该控件,否则该参数传入一个空值。

编写该函数的目的是把对视频播放的操作和用户对滑块的操作结合起来,每次用户对滑动条进行操作时都调用该函数,该函数通过得到滑块的位置来决定视频播放的位置。每次拖动滑块一个位置,视频播放相应跳过1乘以总帧数除以100 的整数倍帧,每次拖动滑块一页,滑块跳过5个位置,视频播放相应跳过5乘以总帧数除以100 的整数倍帧。

OnHScroll函数的实现见程序清单7-26。

程序清单7-26 CVideoPlayDlg::OnHScroll()函数

⑧ OnInfo ()函数。

该函数为用户自定义函数,是为了实现视频信息查询而编写的。该函数对CInfoDlg类的四个成员变量m_strSpeed、m_strFrames、m_strRect、m_strFileName进行了赋值,当用户需要查询播放的视频信息时,通过调用对话框的DoModal()函数弹出信息查询对话框,显示视频信息。OnInfo()函数的实现见程序清单7-27。

程序清单7-27 CVideoPlayDlg::OnInfo()函数

⑨ OnClose()函数。

该函数用来关闭一个已经打开的视频设备,并把m_bOpen设置为FALSE。OnClose ()函数的实现见程序清单7-28。

程序清单7-28 CVideoPlayDlg::OnClose()函数

4. 运行程序

上面完成了一个应用程序的函数代码编写,保存代码文件,然后确保库文件被添加到工程中。程序经过编译运行后得到多媒体视频播放器的执行文件,应用程序播放一个视频文件时运行的界面如图7-6所示。

按“视频信息”按钮查询时,弹出的界面如图7-7所示。

图7-6 视频播放界面

图7-7 视频信息界面

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈