多媒体视频播放器.docx
- 文档编号:26979082
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:30
- 大小:259.86KB
多媒体视频播放器.docx
《多媒体视频播放器.docx》由会员分享,可在线阅读,更多相关《多媒体视频播放器.docx(30页珍藏版)》请在冰豆网上搜索。
多媒体视频播放器
多媒体视频播放器
1基本功能描述
多媒体视频播放工具是目前计算机必备的一个软件,比较流行的有RealPlayer、WindowsMediaPlayer以及国产暴风影音等,能够播放RM、RMVB、MP3、MPEG、DAT等多种格式的视频文件mp3、wma、mdi、wav、avi、dat等格式的音频文件。
用VC++软件设计并编写出一个多媒体视频播放器。
在设计期间,可以选择使用的多媒体控件,制作与用户交互性较好的应用程序界面。
对于控件有多种,可以自己选择。
本次课程设计要使用VC++6.0内部的ActiveX控件——WindowsMediaPlayer控件,建立自己的多媒体播放器。
此多媒体播放器具有打开文件、播放、暂停、停止、关闭、全屏、音量滑块调节、进度滑块调节、快进、快退、显示隐藏播放列表等基本功能,可以播放*.mp3、*.wma、*.mdi、*.wav、*.avi、*.dat、*.mpg、*.rmvb等格式的多媒体文件。
同时还具有自制的播放列表,可以按照列表上的顺序进行一曲、下一曲的播放。
2设计思路
WindowsMediaPlayer是一款Windows系统自带的播放器,支持通过插件增强功能。
其控件作为本次课设的媒体控件可以满足要求。
并且该控件是微软自带的免费控件,通常每个电脑都应有这个控件,方便设计出来的软件在各个电脑运行。
根据WindowsMediaPlayer和各个按钮控件功能的特点,首先要在初始化中对CWMPControl,CWMPSettings,CWMPPlaylist,CWMPMedia等类的对象进行绑定和定义。
播放器的一些基本的功能如播放、暂停、全屏、静音、快进、快退等主要是调用CWMPControl和CWMPPlayer类中的成员函数来进行实现。
对于打开按钮,需要调用通用文件对话框类,调用szFileFilter()文件过滤函数和GetFileName()获取文件名函数。
除了以上提到的功能的实现,还有进度滑条Slider_progress和音量滑动条Slider2是通过对CSliderCtrl类实现的。
图1视频播放器流程图
3软件设计
设计平台可以是Win32的操作平台上,使用已安装的VC6.0++进行设计和调试。
在设计前要确保平台中有WMP控件。
结合之前的设计思路,使用WindowsMediaPlayer等控件来制作多媒体视频播放器。
若是Win64这与VC6.0++不兼容,可以选择更高的版本。
3.1设计步骤
打开VC++6.0,点击“新建”,在“新建”窗口选择“工程”选项卡。
由于程序是基于
对话框的MFC应用程序使用WindowsMediaPlayer等控件来制作多媒体视频播放器。
设置好地址位置和工程名后点“确定”。
这里的工程名字可以是自己的名字拼音缩写,也可以没有任何含义。
图2“新建”对话框示意图
在点击“确定”后进入到了“MFC应用程序向导—步骤1”的设置界面,选择“基本对话框”,然后点击“下一步”。
图3“MFC应用程序向导”示意图
在剩下的3个步骤中,全部选择默认的设置,不要做随意更改,直至“完成”便实现了对话框的创建。
然后是插入控件,先把系统初始化的按钮用“Delete”删除,在单击鼠标右键选择“插入ActiveX控件”,在跳出的对话框中选择“WindowsMediaPlayer”(一般当电脑安装了WindowsMediaPlayer,其控件也应该存在),点击“确定”。
图4添加“WindowsMediaPlayer”控件示意图
虽然已经插入控件了,但这时的控件还不能使用,因为控件的各种类并没有一起加入工程类中。
右击鼠标,选择“建立类向导……”,这时系统跳出对话框提示是否加入来自控件的类,直接点击“确定”就可以了。
图5“WindowsMediaPlayer”控件类添加示意图
接着对控件关联变量,右击加入的WMP控件,点击“属性”,把ID改为“IDC_player”,然后打开“建立类向导……”点到“MemberVariables”页面向IDC_player添加变量。
单击“ADDVariables”,会弹出图6所示的“Addmembername”对话框,命名为“m_player”,设为控制“Control”型,点击“OK”。
图6变量命名示意图
关联变量之后才算是真正的添加了该控件,可以发现在关联变量之后,控件工具栏多了“WindowsMediaPlayer”控件的选项,并且在“SourceFiles”中增加了17个类,相应的头文件也增加了17个,其中最主要的类为Cwmpplayer4,Cwmpcontrols,Cwmpmedia,Cwmpsettings四个大类。
Cwmpplayer4类主要是关于对其他类的对象的调用以及基本的控件功能的实现,提供了与WindowsMediaPlayer控件进行交互的基本方法,其中部分成员函数还能够进一步获取得到其他相关类对象的实例;Cwmpcontrols类主要是对控件的更多的操作;Cwmpmedia类主要是对于媒体文件资源的一些操作;Cwmpsettings类主要是对于媒体文件中的一些基本设置的操作。
3.2界面设计
首先是打开按钮,用于媒体文件的打开;然后依次是播放、暂停、停止、快进、快退、静音、全屏、退出、上一首、下一首、显示/隐藏按钮,以及视频进度滑块和音量滑块条Slider控件。
对控件主要进行变量的关联,以及ID的修改,对于普通按钮进行ID修改,结果如下下表1、表2、表3和表4所示。
表1控件ID以及对应响应函数表
按钮ID
控件Caption
消息响应函数
类型
IDC_BUTTON_open
打开
OnBUTTONopen()
命令按钮
IDC_BUTTON_fullscreen
全屏
OnBUTTONfullscreen()
命令按钮
IDC_BUTTON_play
播放
OnBUTTONplay()
命令按钮
IDC_BUTTON_panse
暂停/播放
OnBUTTONpanse()
命令按钮
IDC_BUTTON_stop
停止
OnBUTTONstop()
命令按钮
IDC_BUTTON_fastforward
快进
OnBUTTONFastforward()
命令按钮
IDC_BUTTON_fasteverse
快退
OnBUTTONfasteverse()
命令按钮
IDC_BUTTON_pre
上一曲
OnBUTTONpre()
命令按钮
IDC_BUTTON_next
下一曲
OnBUTTONnext()
命令按钮
IDC_BUTTON4_mute
静音
OnBUTTON4mute()
命令按钮
IDCANCEL
退出
无
命令按钮
IDC_BUTTON_show
隐藏/展开
OnBUTTONshow()
命令按钮
IDC_BUTTON_save
保存列表
OnBUTTONsave()
命令按钮
IDC_BUTTON_clear
删除列表
OnBUTTONclear()
命令按钮
然后是加入一些关联变量的控件,之前加入了WMPlayer,还要加入类别为“滑块”的Slider来当调节声音的滑块,还有加入类别为“列表框”的ListControl来充当播放列表。
表2控件ID以及关联变量表
按钮ID
控件Caption
变量名称
类型
IDC_OCX1
WMPlayer
m_player
CWMPlayer4
IDC_SLIDER_progress
Slider
m_jindu
CSliderCtrl
IDC_SLIDER_vol
Slider
m_vol
CSliderCtrl
IDC_LIST_MENU
ListControl
m_list2
CListBox
在按钮对应的消息响应函数中写程序将要用到表2的变量和WMP控件中的5个类的函数。
在这五个类中:
Cwmpplayer4类主要是关于对其他类的对象的调用以及基本的控件功能的实现,是WMP控件函数与外部交流的桥梁,不可缺少。
宁外其部分成员函数还能够进一步获取得到其他相关类对象的实例;Cwmpcontrols类主要是对控件的更多的操作,例如播放、暂停;Cwmpmedia类主要是对于媒体文件资源的一些操作,例如获取路径和名称;Cwmpplaylist类主要是关于播放列表的操作;Cwmpsettings类主要是对于媒体文件中的一些基本设置的操作。
表3其他类及对应对象表
类名
头文件名
对象名
CWMPControls
Wmpcontrols.h
m_Control
CWMPSettings
wmpsettings.h
m_Setting
CWMPMedia
wmpmedia.h
m_Media
CWMPPlaylist
wmpplaylist.h
m_Playlist
表4其他数据定义
数据类型
变量名
数据类型
变量名
CString
m_FileName
BOOL
flag,flag2,n
CString
m_PathName
int
vol
除了对各个控件关联变量以及消息响应函数,还要对对话框类进行消息响应函数的关联,如当一首歌播放完后的模式选择。
应用到WM_TIMER消息响应函数以及SetTimer()和KillTimer()函数,如图建立OnTimer函数。
图7添加“WM_TIMER”消息函数示意图
还有菜单的设计,其相对简单,只要名称和ID与表1保持一致就可以了。
在“ResourceFile”中右击鼠标添加“MENU”,属性为“IDR_MENU1”。
但是菜单并未与对话窗口有实质联系,需要将菜单加入到“IDD_SHIFAN_DIALOG”中来,在“IDD_SHIFAN_DIALOG”窗口空白右键单击,选中菜单“IDR_MENU1”,这样便完成了对菜单的加载。
图8控件按钮分布图
编译运行程序后得到了初步的界面效果图,当然还没有加入函数。
同时在左上角会显示自己写的工程名“YLJ_Media_Player”,如图8所示。
3.3关键功能的实现
对于各个按钮、列表功能的实现主要是通过对各个函数加入相应的代码,下文将列出相应的关键代码。
3.3.1“打开”功能的实现
“打开”按钮主要是实现了对打开的文件进行过滤,主要使用了szFileFilter()函数。
点击确定时,首先是把文件路径传给播放列表中,列表在从文件路径中提取文件名来显示。
然后又把文件路径通过SetUrl()交给控件读取播放。
voidCYLJ_Media_PlayerDlg:
:
OnBUTTONopen()
{
charszFileFilter[]="所有支持类型
|*.mp3;*.mp4;*.wma;*.dat;*.wav;*.avi;*.mov;*.rmvb;*.mmm;*.mid;*.rmi;*.mpeg;*.mpg|"
"Mp3File(*.mp3)|*.mp3|"
"Mp4File(*.mp4)|*.mp4|"
"WmaFile(*.wma)|*.wma|"
"VideoFile(*.dat)|*.dat|"
"WaveFile(*.wav)|*.wav|"
"AVIFile(*.avi)|*.avi|"
"MovieFile(*.mov)|*.mov|"
"RmvbFile(*.rmvb)|*.rmvb|"
"MediaFile(*.mmm)|*.mmm|"
"MidFile(*.mid;*,rmi)|*.mid;*.rmi|"
"MPEGFile(*.mpeg)|*.mpeg|"
"MPGFile(*.mpg)|*.mpg|"
"AllFile(*.*)|*.*||";//文件类型过滤
CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);
POSITIONpos=dlg.GetStartPosition();
if(dlg.DoModal()==IDOK)
{while(pos!
=NULL)
{
m_PathName=dlg.GetNextPathName(pos);
m_list2.AddString(m_PathName);
}
}
}
3.3.2“播放”、“暂停”、“停止”“全屏”功能的实现
其实和3.3.1中提到一种播放方法一样使用了SetUrl()函数来实现。
voidCYLJ_Media_PlayerDlg:
:
OnBUTTONplay()
{
CStringstr;
intindex=m_list2.GetCurSel();
m_list2.GetText(index,str);
m_player.SetUrl(str);
}
“暂停”和“停止”功能实现方法和播放差不多,只是使用的m_player.GetControls()中函数改变了。
voidCYLJ_Media_PlayerDlg:
:
OnBUTTONpanse()
{
flag2=!
flag2;
if(flag2){
m_player.GetControls().pause();
}
else{
m_player.GetControls().play();
}
}
voidCYLJ_Media_PlayerDlg:
:
OnBUTTONstop()
{
m_player.GetControls().stop();
}
全屏功能的实现也是调用SetFullScreen(TRUE)函数来实现。
voidCYLJ_Media_PlayerDlg:
:
OnBUTTONfullscreen()
{
m_player.SetFullScreen(TRUE);
}
3.3.3“上一首”和“下一首”功能实现
“上一首”就是让光标往上移一行,也就是对应的光标变量(index)减去1。
当要判断光标在第一行的情况,也就是index=0的时候,这时光标应移到最后一首歌曲或视频上。
voidCYLJ_Media_PlayerDlg:
:
OnBUTTONpre()
{
CStringstr;
intindex=m_list2.GetCurSel()-1;//光标减一
if(index<0)index=m_list2.GetCount()-1;//如果播放完第一曲就自动播放最后一首
m_list2.GetText(index,str);//获得当前光标所指的路径字符串
m_player.SetUrl(str);//开始播放上一首
m_list2.SetCurSel(index);//自动置光标
}
其“下一首”和“上一首”大同小异,只不过index应加1,在光标为最后一行时应判断移动到第一行。
voidCYLJ_Media_PlayerDlg:
:
OnBUTTONnext()
{
CStringstr;
intindex=m_list2.GetCurSel()+1;//光标加一
if(index>=m_list2.GetCount())index=0;//如果播放完最后一曲就自动播放第一首
m_list2.GetText(index,str);//获得当前光标所指的路径字符串
m_player.SetUrl(str);//开始播放下一首
m_list2.SetCurSel(index);//自动置光标
}
3.3.4音量滑动条功能的实现
音量滑动条是区别于其他命令按钮的,它是滑块,是调用CSliderCtrl控件的m_vol变量来实现的。
音量调节函数主要是使用一个嵌套函数“m_player.GetSettings().SetVolume(100-m_vol.GetPos());”实现的。
设置音量用的是“SetVolume()”函数。
在“OnInitDialog()”函数中已对滑块范围进行初始化——CSliderCtrl*pSlide1=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);pSlide1->SetRange(0,100);使音量变化范围为0~100。
voidCYLJ_Media_PlayerDlg:
:
OnReleasedcaptureSlider1(NMHDR*pNMHDR,LRESULT*pResult)
{
m_player.GetSettings().SetVolume(100-m_vol.GetPos());
*pResult=0;
}
另外静音程序如下,在静音按钮按下后把系统音量保存在vol中,等恢复时使用,再设置为静音,再次按下后取消静音然后恢复开始音量。
voidCYLJ_Media_PlayerDlg:
:
OnBUTTON4mute()
{
n=!
n;
if(n)
{
vol=m_player.GetSettings().GetVolume();//获取当前音量值
m_player.GetSettings().SetMute(TRUE);//设为静音
}
else
{
m_player.GetSettings().SetMute(FALSE);//解除静音
m_player.GetSettings().SetVolume(vol);//恢复当前音量值
}
}
3.3.5播放列表功能的实现
播放列表主要有“隐藏/展开”、“保存列表”、“清空列表”这三个功能。
这个列表的三个功能实现前提第一次运行程序时会在E盘新建一个txt文档并命名为“list.txt”。
初始化函数如下:
CStdioFile*fsp=newCStdioFile("E:
\\list.txt",CFile:
:
modeRead);
CStringstr;
while(fsp->ReadString(str))
{
m_list2.AddString(str);
}fsp->Close();
deletefsp;
文档可以保存播放文件列表使在下次打开时可自动的生成播放列表。
下面是“保存列表”的函数。
voidCYLJ_Media_PlayerDlg:
:
OnBUTTONsave()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStdioFilefile;
CStringstrtemp;
file.Open("E:
\\list.txt",CFile:
:
modeCreate|CFile:
:
modeReadWrite|CFile:
:
typeText);
for(inti=0;i { CStringstrtemp; m_list2.GetText(i,strtemp); strtemp+="\n";//换行 file.WriteString(strtemp); } file.Close(); } 然后是“清除列表”功能,用“ResetContent()”直接清除列表。 voidCYLJ_Media_PlayerDlg: : OnBUTTONclear() { CStdioFilefile; m_list2.ResetContent(); file.Open("E: \\list.txt",CFile: : modeCreate); file.Close(); } 最后是“显示/隐藏”功能,其实就是在重新设置窗口大小,若展开则恢复原来的窗口大小,这里使用了SetWindowPos()函数。 voidCYLJ_Media_PlayerDlg: : OnBUTTONshow() { flag=! flag; if(flag)SetWindowPos(NULL,0,0,500,520,SWP_NOMOVE); elseSetWindowPos(NULL,0,0,702,520,SWP_NOMOVE); } 3.3.6进度滑动条功能的实现 进度条可以时时显示播放的位置,而视频进度滑块的初始化放在OnHScroll()函数中实现。 voidCYLJ_Media_PlayerDlg: : OnHScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar) { intm_time; m_time=(int)m_player.GetCurrentMedia().GetDuration(); m_jindu.SetRange(0,m_time);//初始化视频进度滑块 intNewPos; if((CSliderCtrl*)pScrollBar==&m_jindu) { switch(nSBCode) { caseSB_THUMBTRACK: m_jindu.SetPos(nPos); m_player.GetControls().SetCurrentPosition((double)nPos); break; caseSB_PAGEDOWN: NewPos=m_jindu.GetPos(); m_player.GetControls().SetCurrentPosition((double)NewPos); break; caseSB_PAGEUP: NewPos=m_jindu.GetPos(); m_player.GetControls().SetCurrentPosition((double)NewPos); break; } } 视频进度的控制主要是SB_THUMBTRACK、SB_PAGEDOWN、SB_PAGEUP,三个消息响应即移动滑块、单击滑块右边滑条、单击滑块左边滑条的消息响应来实现视频进度的控制。 4结论与心得体会 平时我挺喜欢听歌看电影的,当看到老师给的选题中有多媒体视频播放器这个题目,我开始是还是挺激动的,能够自己做一个简单的程序,满足自己的爱好也是挺有成就感的。 在一开始选这个课题时,我和其他同学都觉得很难。 不像简单计算器和画图软件等课题曾在上课提到过,对于多媒体播放器我看到看到了题目不知道该怎样做。 然后我花了大量时间去了解第一步怎么做,分别查找了各个控件基本用法功能,最后选用了WindowsMediaPlayer控件,因为我vc中只能找到这个与视频有关的控件,于是在网上查了一些关于WindowsMediaPlayer控件的资料,结果按照网上说的方法来根本无法实现,因为网上都说要先插入
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多媒体 视频 播放