多媒体视频播放器
武汉理工大学《专业课程
3(面向对象程序设计)》课程设计说明
目录
1基本功能描述 ......................................................................................................................... 1 2设计思路 ................................................................................................................................. 1
3软件设计 ................................................................................................................................. 3
3.1 设计步骤 ..................................................................................................................... 3
3.2 界面设计 ..................................................................................................................... 6
3.3 关键功能的实现.......................................................................................................... 9
3.3.1 “打开”功能的实现 ....................................................................................... 9
3.3.2 “播放”、“暂停”、“停止”功能的实现 ...................................................... 10
3.3.3 “上一首”和“下一首”功能实现 .............................................................. 11
3.3.4 播放模式选择功能的实现.............................................................................. 11
3.3.5 音量滑动条功能的实现 ................................................................................. 13
3.3.6 播放列表功能的实现 ..................................................................................... 14 4结论与
................................................................................................................... 15 5参考文献 ............................................................................................................................... 16
6思考题 .................................................................................................................................. 16
7 附录 ..................................................................................................................................... 17
7.1调试报告 .................................................................................................................... 17
7.1.1 调试一 ............................................................................................................ 17
7.1.2 调试二 ............................................................................................................ 18
7.2 测试结果 ................................................................................................................... 19
7.3 关键源代码 ............................................................................................................... 20
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书
多媒体视频播放器
1基本功能描述
多媒体视频播放工具是目前计算机必备的一个软件,如大家熟悉的Mediaplayer、Realplayer、金山影霸等。是一种用来播放视频和音频的软件。
用VC++软件设计并编写出一个多媒体视频播放器。在设计期间,可以选择使用的多媒体控件,制作与用户交互性较好的应用程序界面。对于控件有多种,可以自己选择。
系统能选择打开、播放、暂停、停止音频文件和视频文件,并能控制声音的大小, 可以播放*.mp3、 *.wma、 *.mdi、 *.wav、 *.avi、 *.dat 等
的多媒体文件。同时还具有自制的播放列表,可以按照列表上的顺序进行一曲、下一曲的播放,并且设定了顺序播放、随机播放、单曲循环三种播放模式以供选择。
2设计思路
Windows Media Player是一款Windows系统自带的播放器,支持通过插件增强功能。其控件作为本次课设的媒体控件可以满足要求。并且该控件是微软自带的免费控件,通常每个电脑都应有这个控件,方便设计出来的软件在各个电脑运行。
在WMP(Windows Media Player的简称)控件里,与多媒体播放器实现功能有关的类有:Cwmpplayer4,Cwmpcontrols,Cwmpmedia,Cwmpplaylist,Cwmpsettings 五大类。其中播放器的一些基本的功能如播放、暂停、快进、快退等主要是调用CWMPControl和Cwmpplayer4类实现的;播放器中播放列表的实现主要是调用Cwmpplaylist类;对于音量的调节以及静音是调用Cwmpsettings和Cwmpplayer4类实现的。
除了以上提到的功能的实现,还有打开对话框是调用打开对话框类,筛选文件是调用 szFileFilter()文件过滤函数,获取文件名字和路径是用GetFileName()和GetNextPathName()
函数,音量滑动条Slinder是通过对 CSliderCtrl 类实现的。
第 1 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书
打开程序,初始化从
文档中读入文件列表
点击“保
存列表” List.txt
选择格式 char szFileFilter
“删除歌
曲”和“清
除列表”
点击“打开”,
判断是否符合
否 格式
是 把打开的对话框关闭 获取新文件的路径写
给播放列表并传给控
件中
计时器,滑块清零并开始计时和运行
点击“play” 点击“pause” 点击“stop” 音量调制
响应响应响应获取滑块位置参
CwnpConCwnpCoCwnpCo数返回响应
trol类中ntrol类ntrol类CwnpSetting类
play函数 中pause 中stop 中SetVolume
图1 视频播放器流程图
第 2 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书 3软件设计
设计平台可以是Win32的操作平台上,使用已安装的VC6.0++进行设计和调试。在设计前要确保平台中有WMP控件。结合之前的设计思路,使用 Windows Media Player 等控件来制作多媒体视频播放器。若是Win64这与VC6.0++不兼容,可以选择更高的版本。 3.1 设计步骤
打开 VC++6.0,点击“新建”,在“新建”窗口选择“
”选项卡。由于程序是基于 对话框的 MFC 应用程序使用 Windows Media Player等控件来制作多媒体视频播放器。设置好地址位置和工程名后点“确定”。这里的工程名字可以是自己的名字拼音缩写,也可以没有任何含义。
图2 “新建”对话框示意图
由于市场上大多数多媒体播放器不能通过鼠标拖拽来改变客户端的大小,这样为了用户使用方便。所以应选择基于对话框的MFC应用程序的模版。接着点击“下一步”,由于其他的设置因与初始设置一样,所以保持所有选项不改变,再次点击“下一步”直到“完成”。
第 3 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书
图3 “MFC 应用程序向导”示意图
然后是插入控件,先把系统初始化的按钮用“Delete”删除,在单击鼠标右键选择“插入 ActiveX 控件”,在跳出的对话框中选择“Windows Media Player”(一般当电脑安装了Windows Media Player,其控件也应该存在) ,点击“确定”。
图4 添加“Windows Media Player”控件示意图
第 4 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书
虽然已经插入控件了,但这时的控件还不能使用,因为控件的各种类并没有一起加入工程类中。右击鼠标,选择“建立类向导„„”,这时系统跳出对话框提示是否加入来自控件的类,直接点击“确定”就可以了。
图5 “Windows Media Player”控件类添加示意图
接着对控件关联变量,右击加入的WMP控件,点击“属性”,把ID改为“IDC_player”,然后打开“建立类向导„„”点到“Member Variables”页面向IDC_player添加变量。单击“ADD Variables”,会弹出图6所示的“Add member name”对话框,命名为“m_player”,设为控制“Control”型,点击“OK” 。
图6 变量命名示意图
第 5 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书 3.2 界面设计
对于一般多媒体播放器的要求,系统能选择打开、播放、暂停、停止音频文件和视频文件,并能控制声音的大小,并根据自己的设计思路添加表中的按钮和相应的函数,其中函数的响应大多是对鼠标左键单击的响应。并且有序简洁的安排按钮的位置以及分类,使用户方便地使用软件。
表1 控件 ID 以及对应响应函数表
按钮 ID 控件 Caption 消息响应函数 类型
IDC_OPEN 打开 OnOpen() 命令按钮
IDC_PLAY 播放 OnPlay() 命令按钮
IDC_PAUSE 暂停 OnPause() 命令按钮
IDC_STOP 停止 OnStop() 命令按钮 IDC_FASTFORWAR 快进 OnFastforward() 命令按钮 IDC_FASTREVERSE 快退 OnFastreverse() 命令按钮 IDC_BUTTONPRE 上一曲 OnButtonpre() 命令按钮 IDC_BUTTONNEXT 下一曲 OnButtonnext() 命令按钮
IDC_MUTE 静音 OnMute() 命令按钮
IDCANCEL 退出 无 命令按钮
IDC_list 隐藏/展开 Onlist() 命令按钮
IDC_save 保存列表 Onsave() 命令按钮
IDC_ClearOne 删除歌曲 OnClearOne() 命令按钮
IDC_ClearAll 清空列表 OnClearAll() 命令按钮
OnRadio1 顺序播放 无 单选框
OnRadio2 随机播放 无 单选框
OnRadio3 循环播放 无 单选框
然后是加入一些关联变量的控件,之前加入了WMPlayer,还要加入类别为“滑块”的Slinder来当调节声音的滑块,还有加入类别为“列表框”的List Control来充当播放列表。
表2 控件 ID 以及关联变量表
第 6 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书
按钮ID 控件 Caption 变量名称 类型
IDC_player WMPlayer m_player CWMPlayer4
IDC_Slinder Slinder m_Slinder CSliderCtrl
IDC_LIST1 List Control m_ListCtrl CListBox
在按钮对应的消息响应函数中写程序将要用到表2的变量和WMP控件中的5个类的函数。
在这五个类中:Cwmpplayer4 类主要是关于对其他类的对象的调用以及基本的控件功能的实现,是WMP控件函数与外部交流的桥梁,不可缺少。宁外其部分成员函数还能够进一步获取得到其他相关类对象的实例; Cwmpcontrols 类主要是对控件的更多的操作,例如播放、暂停;Cwmpmedia 类主要是对于媒体文件资源的一些操作,例如获取路径和名称;Cwmpplaylist类主要是关于播放列表的操作;Cwmpsettings 类主要是对于媒体文件中的一些基本设置的操作。
对WMP控件中的五个类中函数的使用不能直接使用,而是通过生成的对象来进行调用,所以对象应在“shifanDlg.h”定义,同时类对应的头文件也要在“shifanDlg.h”中用include包含,否则找不到类。若要对对象和变量初始化则应该在“shifanDlg.cpp”中的“CShifanDlg::OnInitDialog()”函数。
表3 其他类及对应对象表
类名 头文件名 对象名 CWMPControls Wmpcontrols.h m_Control CWMPSettings wmpsettings.h m_Setting CWMPMedia wmpmedia.h m_Media CWMPPlaylist wmpplaylist.h m_Playlist
另外还有一些变量虽然没有实际多用,但判断函数是否静音,列表是否展开等需使用。定义也在“shifanDlg.h”中。
表4 其他数据定义
数据类型 变量名 数据类型 变量名 CString m_FileName int flag CString m_PathName int vol
第 7 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书
除了对各个控件关联变量以及消息响应函数,还要对对话框类进行消息响应函数的关联,如当一首歌播放完后的模式选择。应用到 WM_TIMER 消息响应函数以及SetTimer()和KillTimer()函数,如图建立OnTimer函数。
图7 添加“WM,TIMER”消息函数示意图
还有菜单的设计,其相对简单,只要名称和ID与表1保持一致就可以了。在“Resource File”中右击鼠标添加“MENU”,属性为“IDR_MENU1”。但是菜单并未与对话窗口有实质联系,需要将菜单加入到“IDD_SHIFAN_DIALOG”中来,在 “IDD_SHIFAN_DIALOG”窗口空白右键单击,选中菜单“IDR_MENU1”,这样便完成了对菜单的加载。
第 8 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书
图8 控件按钮分布图
编译运行程序后得到了初步的界面效果图,当然还没有加入函数。同时在左上角会显示自己写的工程名“shifan”,如图8所示。
3.3 关键功能的实现
对于各个按钮、列表功能的实现主要是通过对各个函数加入相应的代码,下文将列出相应的关键代码。
3.3.1 “打开”功能的实现
“打开”按钮主要是实现了对打开的文件进行过滤,主要使用了szFileFilter()函数。点击确定时,首先是把文件路径传给播放列表中,列表在从文件路径中提取文件名来显示。然后又把文件路径通过SetUrl()交给控件读取播放。
void CShifanDlg::OnOpen()
{
char szFileFilter[]="媒体文件(*.avi,*.mp3,*.wma)|*.avi;*.mp3;*.wma|";//过滤文件
CFileDialog dlg (true,NULL,NULL,OFN_HIDEREADONLY|
第 9 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书
OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR,szFileFilter);
POSITION pos=dlg.GetStartPosition();
if(dlg.DoModal()==IDOK)//点击确定添加文件
{
while(pos!=NULL)
{
m_PathName=dlg.GetNextPathName(pos);//获取文件路径
m_FileName=dlg.GetFileName();//获取文件名
geminghelujing/* m_ListCtrl*/.AddString(m_PathName);//向列表添加文件路径
m_ListCtrl.AddString(m_PathName);
m_player.SetUrl(m_PathName); //读取路径开始播放
SetTimer(1,1000,NULL);//播放开始的时候就创建计时器
}
}
}
3.3.2 “播放”、“暂停”、“停止”功能的实现
其实3.3.1中提到一种播放方法——使用了SetUrl()函数来实现。这里使用了另外一种方法。
void CShifanDlg::OnPlay()
{
CWMPControls m1;
m1=m_player.GetControls();
m1.play();
}
“暂停”和“停止”功能实现方法和播放差不多,只是使用的m1中函数改变了。
void CShifanDlg::OnPause()
{
第 10 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书
CWMPControls m1;
m1=m_player.GetControls();
m1.pause();
}
void CShifanDlg::OnStop()
{
CWMPControls m1;
m1=m_player.GetControls();
m1.stop();
}
3.3.3 “上一首”和“下一首”功能实现
“上一首”就是让光标往上移一行,也就是对应的光标变量(index)减去1。当要判断光标在第一行的情况,也就是index=0的时候,这时光标应移到最后一首歌曲或视频上。 void CShifanDlg::OnButtonpre() {
CString str;
int index=m_ListCtrl.GetCurSel()-1;//光标减一
if(index<0) index=m_ListCtrl.GetCount()-1;//如果播放完第一曲就自动播放最后一首
m_ListCtrl.GetText(index,str);//获得当前光标所指的路径字符串
m_player.SetUrl(str);//开始播放上一首
m_ListCtrl.SetCurSel(index);//自动置光标
}
,在光标为最后一行时应判其“下一首”和“上一首”大同小异,只不过index应加1
断移动到第一行。
3.3.4 播放模式选择功能的实现
这里有三种播放模式:“顺序播放”、“随机播放”、“单曲循环”。这三种模式的实现是
第 11 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书 在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)实现的。 void CShifanDlg::OnTimer(UINT nIDEvent) {
int index=m_player.GetPlayState();//播放状态
if(index==1)//如果播放完成
{
if(((CButton *)GetDlgItem(OnRadio1))->GetCheck())//如果是顺序播放
{
CString str;
int index=m_ListCtrl.GetCurSel()+1;
if(index>=m_ListCtrl.GetCount()) index=0;
m_ListCtrl.GetText(index,str);
m_player.SetUrl(str);
m_ListCtrl.SetCurSel(index);//自动置光标
}//这样就实现了顺序播放
if(((CButton *)GetDlgItem(OnRadio2))->GetCheck())//随机播放
{
srand(time(0));//目的在于每次都能产生不同的随机数序列
m_ListCtrl.SetCurSel(rand()%m_ListCtrl.GetCount());//随机置光标
m_ListCtrl.GetText(m_ListCtrl.GetCurSel(),m_PathName);
m_player.SetUrl(m_PathName);
}
if(((CButton *)GetDlgItem(OnRadio3))->GetCheck())//单曲循环
{
第 12 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书
m_ListCtrl.GetText(m_ListCtrl.GetCurSel(),m_PathName);
m_player.SetUrl(m_PathName);
}
}
CDialog::OnTimer(nIDEvent);
}
3.3.5 音量滑动条功能的实现
音量滑动条是区别于其他命令按钮的,它是滑块,所以相应的是Customdraw类型,是调用 CSliderCtrl 控件的 m_slinder 变量来实现的。音量调节函数主要是使用一个嵌套函数“m_WMPlayer.GetSettings().SetVolume(m_slinder.GetPos());”实现的。设置音量用的是“SetVolume()”函数。在“OnInitDialog()”函数中已对滑块范围进行初始化——m_slinder.SetRange(0,100)。使音量变化范围为0~100。
void CShifanDlg::OnCustomdrawSlinder(NMHDR* pNMHDR, LRESULT* pResult)
{
UpdateData(true);
m_player.GetSettings().SetVolume(m_Slinder.GetPos());
UpdateData(false);
*pResult = 0;
}
另外静音程序如下,在静音之前先判断该系统音量是否为0,若为0则系统则会恢复
,则把系统音量保存在vol(在shifanDLG.h中已定义了)中,等恢复时使音量;若不为0
用。
void CShifanDlg::OnMute()
{
n=!n;
if(!n)
{
第 13 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书
vol=m_player.GetSettings().GetVolume();// 获取当前音量值
m_player.GetSettings().SetVolume(0);//设为静音
}
else m_player.GetSettings().SetVolume(vol);//恢复当前音量值
}
3.3.6 播放列表功能的实现
播放列表主要有“隐藏/展开”、“保存列表”、“删除列表”、“清空列表” 这四个功能。 这个列表的四个功能实现前提是在工程的文件夹里新建一个txt文档并命名为“list.txt”。文档可以保存播放文件列表使在下次打开时可自动的生成播放列表。下面是“保存列表”的函数。
void CShifanDlg::Onsave()
{
CStdioFile file;//定义文本
file.Open(".\\list.txt",CFile::modeCreate|CFile::modeReadWrite|CFile::typeText);//创建文本
for(int i=0;i
GetCheck())//如果是顺序播放
{
CString str;
int index=m_ListCtrl.GetCurSel()+1;
if(index>=m_ListCtrl.GetCount()) index=0;
m_ListCtrl.GetText(index,str);
m_player.SetUrl(str);
第 20 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书
m_ListCtrl.SetCurSel(index);//自动置光标
}//这样就实现了顺序播放
if(((CButton *)GetDlgItem(OnRadio2))->GetCheck())//随机播放
{
srand(time(0));//目的在于每次都能产生不同的随机数序列
m_ListCtrl.SetCurSel(rand()%m_ListCtrl.GetCount());//随机置光标
m_ListCtrl.GetText(m_ListCtrl.GetCurSel(),m_PathName);
m_player.SetUrl(m_PathName);
}
if(((CButton *)GetDlgItem(OnRadio3))->GetCheck())//单曲循环
{
m_ListCtrl.GetText(m_ListCtrl.GetCurSel(),m_PathName);
m_player.SetUrl(m_PathName);
}
}
CDialog::OnTimer(nIDEvent); }
//下一首
void CShifanDlg::OnButtonnext() {
CString str;
int index=m_ListCtrl.GetCurSel()+1; //光标加一
if(index>=m_ListCtrl.GetCount()) index=0;//如果播放完最后一曲就自动播放第一首
m_ListCtrl.GetText(index,str); //获得当前光标所指的路径字符串
m_player.SetUrl(str); //开始播放下一首
m_ListCtrl.SetCurSel(index);//自动置光标
}
//上一首
void CShifanDlg::OnButtonpre()
第 21 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书 {
CString str;
int index=m_ListCtrl.GetCurSel()-1;//光标减一
if(index<0) index=m_ListCtrl.GetCount()-1;//如果播放完第一曲就自动播放最后一首
m_ListCtrl.GetText(index,str);//获得当前光标所指的路径字符串
m_player.SetUrl(str);//开始播放上一首
m_ListCtrl.SetCurSel(index);//自动置光标
}
//打开
void CShifanDlg::OnOpen()
{
char szFileFilter[]="媒体文件(*.avi,*.mp3,*.wma)|*.avi;*.mp3;*.wma|";//过滤文件
CFileDialog dlg (true,NULL,NULL,OFN_HIDEREADONLY|
OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR,szFileFilter);
POSITION pos=dlg.GetStartPosition();
if(dlg.DoModal()==IDOK)//点击确定添加文件
{
while(pos!=NULL)
{
m_PathName=dlg.GetNextPathName(pos);//获取文件路径
m_FileName=dlg.GetFileName();//获取文件名
m_ListCtrl.AddString(m_PathName);
m_player.SetUrl(m_PathName); //读取路径开始播放
SetTimer(1,1000,NULL);//播放开始的时候就创建计时器
}
}
}
//暂停
void CShifanDlg::OnPause()
第 22 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书
{
CWMPControls m1;
m1=m_player.GetControls();
m1.pause();
}
//播放
void CShifanDlg::OnPlay() {
CWMPControls m1;
m1=m_player.GetControls();
m1.play();
}
//停止
void CShifanDlg::OnStop() {
CWMPControls m1;
m1=m_player.GetControls();
m1.stop();
}
//调节声音
void CShifanDlg::OnCustomdrawSlinder(NMHDR* pNMHDR, LRESULT* pResult)
{
UpdateData(true);
m_player.GetSettings().SetVolume(m_Slinder.GetPos());
UpdateData(false);
*pResult = 0;
}
//隐藏/展开列表
void CShifanDlg::Onlist()
第 23 页
武汉理工大学《专业课程设计3(面向对象程序设计)》课程设计说明书 {
flag=!flag;
if(!flag) SetWindowPos(NULL,0,0,560,480,SWP_NOMOVE);
else SetWindowPos(NULL,0,0,730,480,SWP_NOMOVE);
}
//保存列表
void CShifanDlg::Onsave() {
CStdioFile file;//定义文本
file.Open(".\\list.txt",CFile::modeCreate|CFile::modeReadWrite|CFile::typeText);//创建文本
for(int i=0;i