多媒体播放器的设计与实现报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《多媒体技术》课程论文
题目:基于MFC的多媒体播放器的设计与实现
专业:
班级:
姓名:
学号:
指导老师:
摘要:
本程序是基于MFC集成开发环境,利用ActiveMovie控件实现媒体播放的功能的多媒体播放器。
具有打开文件、播放、暂停、全屏、音量调节、静音、快进、快退等基本播放功能。
系统开发平台为Windows 7操作系统,程序设计环境采用Visual C++ 6.0。
关键字:MFC,ActiveMovie,多媒体
1.开发工具及相关知识介绍
MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数,vc++是微软公司开发的c/c++的集成开发环境,所谓集成开发环境,就是说利用它可以编辑,编译,调试,而不是使用多种工具轮换操作,灵活性较大。
vc也指它的内部编译器,集成开发环境必须有一个编译器内核,例如DevC++其中一个编译器内核就是gcc。
MFC除了是一个类库以外,还是一个框架,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll。
xx是版本,它封装了mfc内核,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的东西,但是由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率。
一个MFC窗口对象是一个C++ CWnd类(或派生类)的实例,是程序直接创建的。
在程序执行中它随着窗口类构造函数的调用而生成,随着析构函数的调用而消失。
而Windows窗口则是Windows系统的一个内部数据结构的实例,由一个“窗口句柄”标识,Windows系统创建它并给它分配系统资源。
Windows窗口在MFC 窗口对象创建之后,由CWnd类的Create成员函数创建,“窗口句柄”保存在窗口对象的m_hWnd成员变量中。
Windows窗口可以被一个程序销毁,也可以被用户的动作销毁。
ActiveX控件是基于COM的可重用组件,主要用于插入ActiveX控件包容器或Web页,ActiveX在外观上和使用上和普通控件一样,还提供属性页以支持在包容器的设计阶段对ActiveX 控件的属性进行可视化设计。
现在多媒体技术正向二个方而发展:一是网络化发展趋势,与宽带网络通信等技术相互结合,使多媒体技术进入科研设计、企业管理、办公自动化、远程教育、远程医疗、检索咨询,文化娱乐、自动测控等领域;二是多媒体终端的部件化、智能化和嵌入化,提高计算机系统本身的多媒体性能,开发智能化家电。
多媒体有三个关键特性:多样性、交互性和集成性。
2.系统的功能说明
2.1打开文件按钮
单击打开按钮,选定需要播放的文件的路径并打开,则选定的文件将被添加到播放列表中。
2.2播放/暂停文件按钮
单击暂停按钮,则播放暂停。
2.3播放进度滑块
用户可以通过滑动播放进度滑块进行对播放进程的控制,实现音频视频文件播放的快进和快退。
2.4随机/顺序/单曲/全曲循环选项
当用户勾选随机/顺序/单曲/全曲循环时,播放模式会切换到
会转变到相应的模式下。
2.5上一曲/下一曲按钮
当用户单击该按钮时,播放的文件相应变化。
2.6音量调节滑块
用户可以通过对音量调节滑块进行调节从而控制音量的大小。
2.7静音选项
选择该选项时将会静音。
2.8停止播放按钮
单击该按钮,停止播放.
2.9退出程序按钮
单击退出程序按钮从播放器中退出。
3.所设计系统实现的各模块介绍
3.1 流程图设计
暂停
3.2 各模块介绍
本多媒体播放系统从界面上看分为四个部分:播放界面、播放控制、播放列表和播放模式。
(1)播放界面:可以看到背景图,还可以方便用户调整播放进度、音量大小,也能对音频和视频进行播放和暂停的控制。
(2)播放模式:有顺序播放、循环播放、随机选择三种模式。
用户通过对这三种模式的选择可以控制音频视频的播放顺序。
(3)播放列表:播放列表记录了被用户添加的需要播放的文件,方便用户在添加文件之后可以迅速找到需要播放的文件。
(4)播放控制:主要包括媒体文件的打开、播放进度的调整、暂停、停止、全屏和程序的退出。
4.各模块源程序及主要部分
4.1.打开文件
void CMediaPlayerDlg::OnOpen()
{
m_listCtrl.SetFocus();CString str;
TCHAR szFilter[] = _T("Mp3 File(*.mp3)|*.mp3|Wma File(*.wma)|*.wma|Video File(*.dat)|*.dat|Wave File(*.wav)|*.wav|A VI File(*.avi)|*.avi|Movie File(*.mov)|*.mov|Media File(*.mmm)|*.mmm|Mid File(*.mid;*,rmi)|*.mid;*.rmi|MPEG File(*.mpeg)|*.mpeg|All File(*.*)|*.*||"); CFileDialog fileDlg(TRUE,NULL, NULL,OFN_HIDEREADONL Y | OFN_OVERWRITEPROMPT, szFilter, this);
CString strFilePath;
if (IDOK == fileDlg.DoModal())
{
strFilePath = fileDlg.GetPathName();
strFilePath.MakeUpper();
m_player.SetUrl(strFilePath);
m_media=static_cast<CWMPMedia>(m_player.newMedia(strFilePath));
m_list.appendItem(m_media);
m_listCtrl.InsertItem(count,m_media.GetName());
m_listCtrl.SetItemText(count,1,_T(m_media.getItemInfo("FileType")));
m_listCtrl.SetItemText(count,2,_T(m_media.GetDurationString()));
m_listCtrl.SetItemText(count,3,_T(strFilePath));
m_listCtrl.SetItemText(count++,4,_T(m_media.getItemInfo("Duration")));
POSITION pos;
pos = m_listCtrl.GetFirstSelectedItemPosition();
IndexInFieldList = m_listCtrl.GetNextSelectedItem(pos);
m_listCtrl.SetItemState(IndexInFieldList,~LVIS_SELECTED,LVIS_SELECTED);
m_player.SetUrl(m_listCtrl.GetItemText(0,3));
m_listCtrl.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED);
}
}
4.2播放
void CMediaPlayerDlg::OnPlay()
{
if(m_list.GetCount()<=0)MessageBox("列表无文件!","Warning",MB_OK);
KillTimer(0);
m_control.play();
if(m_control.GetCurrentPosition()==0)
m_control.SetCurrentPosition(0.01);
SetTimer(0,20,NULL);
}
4.3暂停播放
void CMediaPlayerDlg::OnPause()
{
m_control.pause();
}
4.4停止播放
void CMediaPlayerDlg::OnStop()
{
KillTimer(0);
m_control.stop();
}
4.5全屏
void CMediaPlayerDlg::OnFullscreen()
{
if(!m_player.GetFullScreen())
{
m_control.pause();
AfxMessageBox("请双击退出全屏模式!!");
m_player.SetFullScreen(true);
m_control.play();
}
}
4.6退出
void CMediaPlayerDlg::OnExit()
{
SendMessage(WM_CLOSE);
}
void CAboutDlg::OnOK()
{
// TODO: Add extra validation here
CDialog::OnOK();}
4.7添加背景图片
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP9);
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,
bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
}
}
4.8添加软件图标
HCURSOR CMediaPlayerDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
4.9顺序播放功能
v oid CMediaPlayerDlg::OnOrder()
{
m_order=0;
}
4.10随机播放功能
void CMediaPlayerDlg::OnRandom()
{
m_order=1;
}
4.11单曲循环功能
void CMediaPlayerDlg::OnSinglecircle()
{
m_order=3;
}
4.12全曲循环功能
void CMediaPlayerDlg::OnAllcircle()
{
m_order=2;
}
4.13播放列表
void CMediaPlayerDlg::OnPlaylist()
{
if(flag=!flag)
{
SetWindowPos(NULL,0,0,420,454,SWP_NOMOVE);
}
else
{
SetWindowPos(NULL,0,0,720,454,SWP_NOMOVE);
}
}
4.14音量增加
void CMediaPlayerDlg::OnAdd()
{
m_setting.SetV olume(m_setting.GetV olume()+10);
m_VOLUME.SetPos(m_setting.GetV olume());
}
4.15音量减小
void CMediaPlayerDlg::OnSub()
{
int Volume=m_setting.GetV olume();
m_setting.SetV olume(V olume=V olume-10);
m_VOLUME.SetPos(m_setting.GetVolume());
}
4.16静音
void CMediaPlayerDlg::OnSilence()
{
long temp;
Temp=m_ActiveMovie.GetV olume();
if(temp>-4000)
{
m_ActiveMovie.Pause();
m_ActiveMovie.SetVolume(-4000);
m_ActiveMovie.Run();
}
else
{
m_ActiveMovie.Pause();
m_ActiveMovie.SetVolume(temp+4000);
m_ActiveMovie.Run();
}
}
4.17快进退模块
//快进
void CMediaPlayerDlg::OnForward()
{
double t = m_control.GetCurrentPosition();
m_control.SetCurrentPosition(t=t+10);
}
//快退
void CMediaPlayerDlg::OnReverse()
{
double t = m_control.GetCurrentPosition();
m_control.SetCurrentPosition(t=t-10);
}
4.18上一曲、下一曲
//上一曲
void CMediaPlayerDlg::OnLast()
{
m_listCtrl.SetFocus();
POSITION pos;CString strName;
UINT flag1 = LVIS_SELECTED|LVIS_FOCUSED;
pos = m_listCtrl.GetFirstSelectedItemPosition();
IndexInFieldList = m_listCtrl.GetNextSelectedItem(pos);
if(IndexInFieldList == -1)
{
AfxMessageBox("列表内没有被选中项!");
return;
}
if(IndexInFieldList == 0)
{
AfxMessageBox("已经到了列表头部!");
m_listCtrl.SetItemState(IndexInFieldList, flag1, flag1);
return;
}
m_listCtrl.SetItemState(IndexInFieldList,~LVIS_SELECTED,LVIS_SELECTED );
m_listCtrl.SetItemState(IndexInFieldList-1, flag1, flag1);
strName=m_listCtrl.GetItemText(IndexInFieldList-1,3);KillTimer(0);
m_control.stop();
m_player.SetUrl(strName);
m_control.SetCurrentPosition(0.01);
m_control.play();
SetTimer(0,20,NULL);
}
//下一曲
void CMediaPlayerDlg::OnNext()
{
m_listCtrl.SetFocus();
POSITION pos;CString strName;
UINT flag1 = LVIS_SELECTED|LVIS_FOCUSED;
pos = m_listCtrl.GetFirstSelectedItemPosition();
IndexInFieldList = m_listCtrl.GetNextSelectedItem(pos);
if(IndexInFieldList == -1)
{
AfxMessageBox("列表内没有被选中项!");
return;
}
if(IndexInFieldList == m_listCtrl.GetItemCount()-1)
{
AfxMessageBox("已经到了列表末尾!");
m_listCtrl.SetItemState(IndexInFieldList, flag1, flag1);
return;
}
m_listCtrl.SetItemState(IndexInFieldList,~LVIS_SELECTED,LVIS_SELECTED );
m_listCtrl.SetItemState(IndexInFieldList+1, flag1, flag1);
strName=m_listCtrl.GetItemText(IndexInFieldList+1,3);KillTimer(0);
m_control.stop();
m_player.SetUrl(strName);
m_control.SetCurrentPosition(0.01);
m_control.play();
SetTimer(0,20,NULL);
}
5.运行界面
5.1版权信息
点击“关于”按钮,就可以查看版权信息
5.2初始界面
5.3添加文件
点击“打开文件”按钮可以添加自己喜欢的歌曲或视频。
5.4播放文件
打开文件即可播放自己喜欢的音乐或视频。