APP下载

MFC多媒体视频播放器

2017-04-06陈超逸

中国科技纵横 2016年23期

陈超逸

【摘 要】MFC ( Microsoft Foundation Class)是用来编写Windows应用程序的 C++ 类集,其中封装了大部分WindowsAPI 函数和Windows 控件,使用MFC 类库和Visual C++ 提供的高度可视的应用程序开发工具,可使应用程序开发变得简单,提高代码的可靠性和可重用性,随着多媒体性能的极大提升,程序中经常要播放一段视频或者一段音频,如果能够简单地插入音频和视频,将极大缩短程序的开发时间。本文基于 MFC 在 Visual C++ 环境下利用Windows Media Player 控件实现了音频视频文件的播放。

【关键词】视频播放器 MFC Windows Media Player Visual C++

1 引言

在本次设计中,考虑用Microsoft Windows Media Player为数字音频和视频提供支持,还可以根据需要修改视频内容的播放方式。使用 Windows Media Player 软件开发工具包 ,可以扩展独立Player 的功能,借助 ActiveX 控件资源和其他现有的控件资源并将播放功能嵌入到自己的应用程序中。本次课程设计实现了一个基于Media Player组件的多媒体播放器,能够支持目前多数格式的媒体文件。

2 设计思路

Windows Media Player是一款Windows系统自带的播放器,支持通过插件增强功能。其控件作为本次课设的媒体控件可以满足要求。并且该控件是微软自带的免费控件,通常每个电脑都应有这个控件,方便设计出来的软件在各个电脑运行。在WMP(Windows Media Player的简称)控件里,与多媒体播放器实现功能有关的类有:Cwmpplayer4,Cwmpcontrols,Cwmpmedia,Cwmpplaylist,Cwmpsettings 五大类。播放器的一些基本的功能如播放、暂停等主要是调用CWMPControl 和 CWMPPlayer 类中的成员函数来进行实现。 对于打开按钮,需要调用通用文件对话框类,调用 szFileFilter()文件过滤函数和 GetFileName()获取文件名函数。播放列表主要是通过对 CListBox 类进行初始化,调用 m_ListCtrl 中的 AddString()函数来加载文件名到列表,再定义 Onlist()、SelchangeList1()、Onsave()、Ondelist()函数来实现展开、隐藏等功能。音量滑动条Slinder 是通过对 CSliderCtrl 类进行初始化,调用 m_slinder 中的CustomdrawSlider()函数来定义音量的改变。

3 软件设计

设计平台可以是Win32的操作平台上,使用已安装的VC6.0++进行设计和调试。在设计前要确保平台中有WMP控件。结合之前的设计思路,使用 Windows Media Player 等控件来制作多媒体视频播放器。若是Win64这与VC6.0++不兼容,可以选择更高的版本。

3.1 设计步骤

打开 VC++6.0,点击“新建”,在“新建”窗口选择“工程”选项卡。由于程序是基于对话框的 MFC 应用程序使用 Windows Media Player等控件来制作多媒体视频播放器。设置好地址位置和工程名后点“确定”。这里的工程名字可以是自己的名字拼音缩写,也可以没有任何含义。比如以“CCYMFC多媒体播放器1.0”为工程名,然后点击“确定”。

在点击“确定”后进入到了“MFC 应用程序向导—步骤 1”的設置界面,选择“基本对话框”,可以自己选择语言,然后点击“下一步”。接着点击“下一步”,由于其他的设置因与初始设置一样,所以保持所有选项不改变,再次点击“下一步”直到“完成”。在建立的对话框中,点击右键,选择“插入 ActiveX 控件” ,在跳出的对话框中选择“Windows Media Player”,点击“确定”。

虽然已经插入控件了,但这时的控件还不能使用,因为控件的各种类并没有一起加入工程类中。右击鼠标,选择“建立类向导……”,这时系统跳出对话框提示是否加入来自控件的类,直接点击“确定”就可以了。右键单击 “建立类向导”,在对话框中选择“Member Variables”选项卡,单击“ADD Variables”,“Confirm Classes”中点击“OK”会 “Add member name”对话框,命名为“m_player”,设为控制“Control”型,单机“OK”。关联变量之后才算是真正的添加了该控件,可以发现在关联变量之后,控件工具栏多了“Windows Media Player”控件的选项,并且在“Source Files”中增加了17个类,相应头文件也增加了17个,其中最主要的类为Cwmpplayer4,Cwmpcontrols,Cwmpmedia,Cwmpplaylist,Cwmpsettings 五大类。

3.2 界面设计

对于多媒体播放器的,本次课程设计要求系统能选择打开、播放、暂停、停止,全屏视频文件,并能控制声音的大小,其中函数的响应大多是对鼠标左键单击的响应。可以通过下表设置安排按钮的位置以及分类,使用户快速对控件ID进行修改。然后是加入一些关联变量的控件,之前加入了WMPlayer,还要加入类别为“滑块”的Slinder来当调节声音的滑块,还有加入类别为“列表框”的List Control来充当播放列表。

除了对各个控件关联变量以及消息响应函数,还要对对话框类进行消息响应函数的关联,如当一首歌播放完后的模式选择。应用到 WM_TIMER 消息响应函数以及SetTimer()和KillTimer()函数,建立OnTimer函数。

3.3 关键功能的实现

对于各个按钮、列表功能的实现主要是通过对各个函数加入相应的代码,下文将列出相应的关键代码,按键功能可对应关键代码添加在相应的位置。

播放列表主要有“播放列表”、“保存列表”、“删除列表”、“清空列表” 这四个功能。这个列表的四个功能实现前提是在工程的文件夹里新建一个txt文档并命名为“list.txt”。文档可以保存播放文件列表使在下次打开时可自动的生成播放列表。然后是“播放列表”功能,其实就是在重新设置窗口大小,若展开则恢复原来的窗口大小,这里使用了SetWindowPos()函数。最后是“删除当前”和“清除列表”,使用了“DeleteString()”来删除播放列表中的代表文件路径的字符串。用“ResetContent()”直接清除列表。同时不管那种功能,执行完成后要保存列表,这样才能使播放列表与list.txt同步。“打开”按钮主要是实现了对打开的文件进行过滤,主要使用了szFileFilter()函数。点击确定时,首先是把文件路径传给播放列表中,列表在从文件路径中提取文件名来显示。然后又把文件路径通过SetUrl()交给控件读取播放。

这里有三种播放模式:“顺序播放”、“随机播放”、“单曲循环”。这三种模式的实现是在OnTimer()一个时间消息响应函数的实现的。先判断一个文件播放完毕后,再分别判断OnRadio1、OnRadio2和OnRadio3对应的按钮是否按下,若有按钮按下就进入到对应的if语句中。顺序播放就是int index=m_ListCtrl.GetCurSel()+1跟上一首相同;随机播放先是用srand(time(0))来每次都能产生不同的随机数序列,再用rand()%m_ListCtrl.GetCount()产生随机光标;循环播放是m_ListCtrl.GetText(m_ListCtrl.GetCurSel(),m_PathName)实现的。

音量滑动条是区别于其他命令按钮的,它是滑块,所以相应的是Customdraw类型,是调用 CSliderCtrl 控件的 m_slinder 变量来实现的。音量调节函数主要是使用一个嵌套函数“m_WMPlayer.GetSettings().SetVolume(m_slinder.GetPos());”实现的。设置音量用的是“SetVolume()”函数。在“OnInitDialog()”函数中已对滑块范围进行初始化——m_slinder.SetRange(0,100)。使音量變化范围为0~100。

4 问题发现与解决

在完善程序和调试过程中出现了各种各样的语法错误,通过百度查阅相关语法问题以及细心的检查中得到了解决,现将我遇到的问题以及解决方法摘录如下:

已经运行了一个窗口,再次运行时会出现cannot open Debug/CWMJ.exe for writing的错误提示,关闭之前的运行窗口,再次运行,此错误提示消失,这是由于编译的exe文件运行了多次,重复打开了窗口。之前定义了的消息处理函数,在界面上删除后,没在程序中删除,会报error2039:Onadd:is not a member of “CCWMJDlg”错。在程序中删除此函数,再次运行,此错误提示消失。函数的运用不正确,GetVolume()函数不能带参,会报GetVolume():function does not take 1 parameter错。修改代码,不让其带参,再次运行,此错误提示消失。

5 结语

编写好的软件能选择打开、播放、暂停、停止音频文件和视频文件,并能控制声音的大小是否全屏, 可以播放*.mp3、*.wma、*.mdi、*.wav 等格式的多媒体文件。同时还具有自制的播放列表,可以按照列表上的顺序进行的播放,同时还有保存列表和删除列表删除当前的作用,并且设定了顺序播放、随机播放、单曲循环三种播放模式以供选择。