《多媒体视频播放器.docx》由会员分享,可在线阅读,更多相关《多媒体视频播放器.docx(13页珍藏版)》请在课桌文档上搜索。
1、目录1 .根本功能描述O2 .设计思路13 .软件设计23.1设计步骤*t23.2界面设计3.2.1图标设计3.2.2对话框设计菜单栏设计3.3关键功能的实现3.3.1翻开、播放功能的实现3.3.2“暂停/继续、停止功能的实现静音和音量滚动条的实现5播放列表功能的实现4.心得体会65.思考题66.附录776.1 调试过程76.2 测试结果7.6.3关键源代码参考文献812多媒体视频播放器1 .根本功能描述多媒体视频播放器作为用来播放视频和音频的软件,是当下信息时代中人们口常学习、办公、休闲娱乐都不可或缺的软件,也是WindoWS系统中必备的一个重要软件。在学习了Windows编程应用后,我们可
2、以利用VC+6.0的MFC应用编程制作属于自己的多媒体视频播放器。多媒体视频播放器要实现对*.avi、*.mp3、*.Wma、*.WmV等多种格式的多媒体文件进行播放。同时包含翻开、播放、暂停、继续、停止、快退快进、音量控制等根本功能和对播放列表的展开、保存、删除和清空等操作。其中可以通过按钮、滚动条和菜单等多种方式来实现相应控制操作。2 .设计思路要利用VC+6.0创立多媒体播放器,我们必须先了解MFC编程,MFC是MiCrOSOft公司提供的基于Win32APl的C+类库集,它定义了一个标准的应用程序框架,借助这个框架,用户可以轻松地开发出标准的WindoWS应用程序。创立应用程序时,我们
3、需要用到APPWiZard、CIaSSWiZard和各种控件。而在本次多媒体视频播放器的设计中,我们需要用到VC+6.0内部的ActiveX控件WindowsMediaPlayer控件。WindOWSMediaPlayer简称WMP,是一款WindoWS系统自带的播放器,支持通过插件增强功能。其控件作为本次课设的媒体控件可以满足要求。并且该控件是微软自带的免费控件,通常WindoWS系统中都有这个控件,所以选用这个控件方便设计出来的软件在各个电脑运行。要创立这个程序,首先是要建立相应的对话框和各种控件(包括插入WindowsMediaPlayer控件)以及图标、菜单栏等资源,然后为初始化设置对
4、话框相应的样式等包括修改图标代码等),然后为相关控件建立相应的消息相应函数,通过对相应类中函数的调用实现相应的功能。主要包含播放列表操作模块和视频播放模块,又各自包含相应的功能函数。软件流程图如下:开女台对于本次多媒体播放器,我们采用MFC对话框创立,然后插入WMP控件,借助类向导完成各个功能函数的编写。在WMP控件里,与多媒体播放器实现功能有关的类有:Cwmpplayer4,Cwmpcontrols,Cwmpmedia.Cwnipplaylist,CWmPSettingS五大类。其中播放器的一些根本的功能如播放、暂停、快进、快退等主要是调用CWMPControl和Cwmpplayer4类实现
5、的;播放器中播放列表的实现主要是调用Cwmpplaylist类;对于音量的调节以及静音是调用Cwmpsettings和Cwmpplayer4类实现的。除了以上提到的功能的实现,还有翻开对话框是调用翻开对话框类,筛选文件是调用SZFileFilter()文件过滤函数,获取文件名字和路径是GetFiIeNameo和GetNextPathNameO函数,音量滑动条Slinder是通过对CSliderCtrI类实现的。3.1 设计步骤首先建立一个以自己名字命名的MFC工程,并在随后弹出的MFC应用程序向导中选择创立相应根本对话框。图2新建对话框示意图然后在资源对话框中,先删去初始化的“确定和取消,再单
6、击鼠标右键选择“插入ActiveX控件,在跳出的对话框中选择WindowsMediaPlayer。图3添加“WindowsMediaPlayer控件示意图随后在类向导中找到WMP控件对应的ID号,然后把控件的相关类都添加进来,让控件与对话框联系起来。图4*WindowsMediaPlayerw控件类添加示意图然后再在类向导MemberVariables中为控件关联相应的变量,命名为m_player,类型选择为Control。图5SourceFilew新增的文件这时我们己经可以看到在SourceFile中新增了17个类相关文件,在相应头文件中也增加了17个头文件。其中最主要的类为Cwmpplay
7、er4,Cwmpcontrols,Cwmpmedia,Cwmpplaylist,CWmPSeningS五大类。CWmPPlayer4类主要是关于对其他类的对象的调用以及根本的控件功能的实现,提供了与WindOWSMediaPIayer控件进行交互的根本方法,其中局部成员函数还能够进一步获取得到其他相关类对象的实例;Cwmpcontrols类主要是对控件的更多的操作;Cwmpmedia类主要是对于媒体文件资源的一些操作;Cwmpplaylist类主要是关于播放列表的操作;Cwmpsettings类主要是对于媒体文件中的一些根本设置的操作。3.2 界面设计3.2.1 图标设计为了界面美观,图标采用
8、自己下载的播放器图标,在Source里插入“Icon来引入图标,ID为“ID1CON1。此处需要注意的是图标的格式须为ico格式,然后要在相应位置将默认的图标ID改为所需的,即在图标相应变量定义的地方改ID号:m_hlcon=AfxGetApp()-LoadIcon(IDI_ICON1);/图标3.2.2 对话框设计在资源界面中编辑对话框,添加各个控件并根据自己喜好排布和设置相应ID号,构建界面友好美观的对话框。然后在类向导中为相关控件建立相应消息响应映射,添加消息响应函数。表1控件ID以及对应响应函数表按钮ID控件Caption消息响应函数IDC_OPEN翻开OnOpei()IDC_PLAY
9、播放OnPIayO1DCPAUSE暂停/继续OnPauseOIDC_STOP停止OnStopOIDC_FORWARD快进OnForwardOIDC_BACKWARD快退OnBackwardOIDC_MUTE静音/音量OnMuteOIDC-EXIT退出OnExit()IDC_LIST播放列表OnListOIDC_SAVE保存列表OnSave()IDC_DELETE删除视频OnDeIeteO1DC_CLEAR清空列表OnClearO然后是参加一些关联变量的控件,之前参加了WMPlayer,还要参加CSIiderCtrI类型的滑块Slider来当调节声音,参加“CListBox类型列表框“ListC
10、ontrol充当播放列表。表2控件ID以及关联变量表按钮ID控件Caption变量名称类型IDC_OCX1WMPlayerm_playerCWMPlayer4IDC_SLIDER2Sliderm_volumeCSliderCtrlIDC_LIST1ListControlmistCListBox对话框的最后样式为:图6对话框的样式323菜单栏设计在已经构建好对话框,完成控件的关联和相应消息响应函数的添加后,菜单栏的添加就相对简单多了,只需要将相应菜单项选择项的ID号与上述表中ID保持一致就能直接用菜单项选择项调用相应消息响应函数了。图7菜单栏的创立3.3 关键功能的实现关键功能的实现主要都是在相
11、关控件的相应消息相应函数中添加相应的代码,从而实现所需要的功能。下面将讨论关键的功能函数,相应代码在附录中给出。3.3.1 翻开、“播放功能的实现“翻开按钮主要是实现了对翻开的文件进行过滤,主要使用了SZFiIeFilter()函数。定义了能翻开的文件格式等。点击确定时,首先是获取文件路径,然后把文件路径传给播放列表中,列表在从文件路径中提取文件名来显示。而播放按钮能够从列表中获取文件路径,然后把文件路径通过SetUrIo交给控件读取播放。同时定义了初始的音量大小。3.3.2 “暂停/继续、“停止功能的实现“暂停/继续按钮是通过GetDlgltemTeXt()函数获取按钮上的字符来判断是当按钮
12、按下时是执行暂停还是继续播放,并通过SetDlgItemTeXt()函数来改变按钮上的显示字符。其中暂停和继续播放这里是利用Cwmpcontrols类中的GetControls().pause()和GetContrOISo.play()这两个函数来实现的。当按下暂停时视频停止播放,同时按钮显示继续,点击“继续,那么继续播放视频并显示“暂停。而停止功能在这里那么是直接利用了控件类中的ClOSe()函数来实现停止的。值得一提的是程序中的快进快退功能也是利用了Cwmpcontrols类中的fastForward()和fastReverse()函数来实现的。3.3.3 静音和音量滚动条的实现静音功能的
13、实现与暂停/继续功能类似,都是利用GetDIgltemTeXto和SetDlgItemTeXtO函数来获取和改变按钮上的显示字符。所不同的是,静音功能的实现是调用了“CWMPSettingsqpp文件里的SetVOIUme()函数。初始时按钮显示音量,按下后静音,音量滚动条也回到最低位置,按钮显示“静音,再次按下音量恢复,显示“音量。音量滚动条相比于前面几个功能的实现,要显得复杂很多,区别于其他命令按钮的,它是滑块,需要关联变量“m_volume,在“OnInitDiaIogO函数中己对滑块范围进行初始化m_volume,SetRange(0,100);使音量变化范围为0100,再调用嵌套函数
14、m_player.GelSettings().SetVolume(m_volume.GetPos();来获取滑块位置并设置相应音量。3.3.4 播放列表功能的实现播放列表主要有“隐藏/展开、“保存列表、“删除选中视频、“清空列表这四个功能。这个列表的四个功能实现前提是在工程的文件夹里新建一个txt文档并命名为“Iisttxt。文档可以保存播放文件列表使在下次翻开时可自动的生成播放列表。展开列表和隐藏列表是通过SetWindoWPoSo函数对对话框的大小进行设置,让最右边的列表可以显示出来和被隐藏。保存列表是利用CFile类中的相应函数来创立文本:fileQpen(.list.txt,CFile
15、:modeCreate|CFile:modeReadWrite|CFile:typeText);创立文本再利用函数GetTeXt()和WriteStringo这两个函数把列表中的内容写入文档中去。删除选中的视频那么是通过如下代码来实现的:m_list.DeleteSlring(m_list.GetCurSel();/删除当前光标所选择的行清空列表直接利用CWmPPIayliSt类中的RCSetContent()函数来实现的。4 .心得体会本次课程设计安排在学期末,比拟深入地考察了我们对MFC的运用及掌握。与让我们更进一步地了解到了WindOWS编程的实际应用,在开拓我们眼界的同时稳固了我们课上
16、所学知识,也进一步锻炼了我们的自学能力和对WindOWS编程的实际运用能力。在开始了解到可视化编程的时候,我就特别地感兴趣,因为这较于之前所学的普通C和C+编程来得更为实际,给人一种实际感,让我觉得学的东西能用得上,而且感觉也很有高端的感觉。可视化编程能极大地调动我的学习积极性,所以在WindOWS编程的学习中投入了更多的精力和时间,也对编程语言的学习有了前所未有的兴趣和好奇。很遗憾的是在本次卷面考试中没有相关的大题来检验我们的所学成果,庆幸的是学校安排了更为直接,更为适宜课程设计的方法来考察我们的学习情况,对于编程语言这种课程来书,这种考查方式无疑是最正确的,实际的东西就要实践中去检验。本次
17、课设我选择了最贴近我们生活所用的多媒体视频播放器的设计,这个课题使我产生了浓厚的兴趣,并开始很早就着手准备,可惜的是,开始遇到了一个难题,之后由于各种考试实验等耽误,所以被搁浅了,在最后几天才重新开始做,不过在真正自己编写的时候又遇到了各种问题,其中最严重的是在我自己和室友的电脑上,编译连接成功后,只要一运行就会崩溃,开始一直以为是软件编写过程中出了过失,花费了大量时间来调试和排错,但是并没有起到什么作用。后来意识到可能是软件和系统兼容性的问题,换到其他人的电脑上可以完美运行,不过由于之前消耗了大量时间,所以后面不得不放弃了开始原有的一些设计思路。总之呢,通过本次课程设计,自己学到了很多东西,
18、不仅在对MFC应用程序的框架理解和相应创立上有了进一步提升,对自己的缺乏之处有了认识,也对程序的调试和检查有了更深入的掌握,也体会到了与他人沟通交流的重要性,更进一步加深了我对WindoWS编程的浓厚兴趣。很感谢学校和老师能提供这次的锻炼时机,让自己在即将结束的年尾有了更多的收获,对于新的一年有了更多的思考与展望。5 .思考题1 .控件自带的类和本程序中的类是如何共同作用的?答:控件自带的类不能直接调用,是通过在头文件中定义相应类的对象,然后通过对象名来调用相应函数,而本程序对话框的类是通过给控件添加消息响应函数。一般控件类有关的函数都是在对话框自身的函数和控件的消息响应函数中调用。以此实现控
19、件自带类和本程序中的类的共同作用。2 .说明程序中调用的控件函数的作用?答:各个控件的消息响应函数如下表所示:表3控件响应函数及其功能功能控件函数功能控件函数退出OnExitO音量条OnCustomdiaw翻升OnOpen()Slider2()播放OnPlayO停止OnStopO暂停/继续OnPauseO播放列表OnListO快进OnForward删除视频OnDeleteO快退OnBackwardO保存列表OnSave()静音/音量OnMute()清空列表OnClearQ6 .附录6.1 调试过程1 .有一些头文件没有添加,导致在ZJ_KESHE_WMPDIg.cpp中构建函数时,很多控件函数
20、不能被识别,导致出现了很多错误。2 .开始编写到-般后,程序一运行就停止工作,后来不断进行单步调试,仍然解决不了问题,最后发现是本人电脑上的软件的问题,换到其他人电脑上根本可以完美运行。3 .开始音量条关联的变量没有初始化范围,然后起不到作用,后来添加了语句“m_volume.SetRange(0,l(M)z。4 .在设置时候直接删除了原来的默认图标,然后在代码中将其ID号直接改为所设置的图标,后来编译有问题,逐步在代码中查找后发现还需要将有一处对话框创立里包含的删去。6.2 测试结果经过调试,程序能够IE确运行,可以翻开*.avi,*.mp3,*.wma,*.wmv,*.mov格式的文件,能
21、够实现播放,暂停,停止,快进,快退,音量控制,播放列表控制等多种功能,其中大局部还可以在菜单项选择项中执行。整体运行结果如下列图所示:图8运行结果图6.3 关键源代码BOoLCZJJCESHE-WMPDlg:OnInitDiaIogo中新参加了如下代码:flag=l;n=0;m-volume.SetRange(0,100);SetWindOWPoS(NULL,0,0,580,460,SWPNOMOVE);无相对移动mist.SetHorizontalExtent(1000);CStdioFile*fsp=newCStdioFiIe(”list.txt,CFile:modeRead);记住列表C
22、Stringstr;while(fsp-ReadString(str)mJist.AddString(str);fsp-Close();deletefsp;展开和隐藏列表voidCZLKESHE一WMPDIg:OnList()/展开列表flag=!flag;if(flag=l)SelWindowPos(NULL,0,0,580,460,SWP_NOMOVE);elseSetWindowPos(NULL,0,0,795,460,SWP_NOMOVE);)翻升voidCZJ_KESHE_WMPDlg:OnOpen()CharSZFiIeFilter=媒体文件(*.avi,*.mp3,*.wma,*
23、.wmv,*.mov)*.avi;*.mp3;*.wma;*.Wmv;*.mov|;CFileDialogdIg(true,NULL,NULL,OFN一HlDEREADoNLYlOFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR,SzFileFilter);POSITIONpos=dlg.GetStartPosition();if(dlg.DoModal()=IDOK)/点击确定添加文件while(pos!=NULL)m_PathName=dlg.GetNextPa由Name(POs);/获取文件路径m_list.AddString(ITJ-PathName);向列表添加
24、文件路径/退出voidCZLKESHE-WMPDlg:OnEXitoOnOK();播放列表中双击播放选中文件voidCZLKESHE-WMPDlg:OnDblCIkLiSt1()CStringstr;intindex=m_list.GetCurSel();m_list.GetText(index,str);m_player.SetUrl(str);m_PathName=str;保存列表voidCZJ_KESHE_WMPDlg:OnSave()Hle.Open(.list.txt,CFile:modeCreate|CFile:modeReadWriteQFile:typeText),创立文本fo
25、r(inti=0;im_list.GetCount();i+)CStringstrtemp;mist.GetText(Lstrtemp);获得文本中的内容strtemp+=n;需要换行Hle-WriteString(Strtemp);将获得内容写入列表file.Close();voidCZLKESHE_WMPDlg:OnDeleteo从歹U表中删除选中视频fmist.DeleteString(mist.GetCurSel();删除当前光标所选择的行OnSaveO;自动保存删除某一行后的播放列表删除列表voidCZLKESHE-WMPDlg:OnCIear()m_list.ResetConten
26、tO;file.Open(.list.txt,CFile:modeCreate);voidCZLKESHE-WMPDlg:OnPlay()/播放m_player.SetUrl(m_PathName);读取路径开始播放m_player.GetSellings().SetVblume(50);初始音量暂停或继续voidCZLKESHE-WMPDlg:OnPaUSeoCStringstrtemp;GetDlgItemTeXt(IDCPAUSE,Strtemp);/获取按钮上的字符if(strtemp.Compare(暂停)=0)假设显示暂停,点击暂停,并显示“继续m-player.GetContro
27、ls().pause();SetDlgItemTeXt(IDC一PAUSE,继续);if(strtemp.Compare(继续)=0)/实现从暂停点继续播放,并显示暂停m-player.GetControls().play();SetDlgItemTeXt(IDC一PAUSE,暂停);停止voidCZLKESHE_WMPDlg:OnStOPom_player.close();静音或正常音量voidCZLKESHE-WMPDlg:OnMUte()CStringstrtemp;if(m_player.GetPlayState()=2)|(m_player.GetPlayState()=3)GeID
28、IghemTeXt(IDC_MUTE,StrtemP);/获取按钮上的字符if(strtemp.Compare(音量)=0)/假设显示音量,点击音量,并显示静音vol=m_player.GetSettings().GetVblumeO;获取当前音量值m_player.GetSettings().SetVblume(O);设为静音SeIDlgltemTeXI(IDCMUTE,静音);if(strtemp.Compare(静音)=0)m_player.GetSettings().SetVolume(Vo1)J恢复当前音量值SetDlgItemTeXt(IDC一MUTE,音量);else;音量条vo
29、idCZLKESHE_WMPDlg:OnCUStOmdraWSlider2(NMHDR*pNMHDR,LRESULT*pResult)fm_player.GetSettings().SetVolume(m_volume.GetPos();*pResult=O;快退voidCZJ_KESHE_WMPDlg:OnBackward()m_player.GetControls().fastReverse();快进voidCZJ_KESHE_WMPDlg:OnForward()m_player.GetControls().fastForward();7.参考文献11揣锦华.面向对象程序设计与VC+实践M.西安:西安电子科技大学出版社,2005.2马德骏,张建宏,汤练兵.C语言程序设计M.北京:科学出版社,2023.