《音频播放程序的设计与实现.docx》由会员分享,可在线阅读,更多相关《音频播放程序的设计与实现.docx(28页珍藏版)》请在三一办公上搜索。
1、音频播放程序的设计与实现 综合程序 课程设计说明书课程设计名称: 综合程序课程设计 课程设计题目: 音频播放程序的设计与实现 学 院 名 称: 信息工程学院 专业:电子信息工程 班级: 学号: 姓名: 评分: 教师: 20 12 年 月 日 综合程序 课程设计任务书20 14 20 15学年 第 2 学期 第 1 周 2周 题目音频播放程序的设计与实现内容及要求利用VC+开发一个支持wav、mp3、wma等不同音频格式的媒体播放器。通过课程设计掌握多媒体编程的基本原理。任务:1) 编程实现一个可支持多种音频格式的媒体播放器,其基本功能包括媒体播放、音量调节、播放进度选择、暂停、停止以及歌曲信息
2、的查询与添加等;2) 给出程序的总体设计和详细设计,要求程序总体架构图、详细设计的流程图,函数、变量说明等3) 给出程序运行、测试的详细结果。进度安排:3月1日3月2日:利用各种渠道查找资料;3月3日:完成需求分析,确定程序功能,确立程序设计思想;3月4日3月9日:进行详细设计,实现编码;3月10日3月11日:进行程序测试,完善编码;撰写设计说明书,准备验收;3月12日3月13日:验收。学生姓名:指导时间:3月3日至3月9日指导地点: 任务下达任务完成考核方式1.评阅 2.答辩 3.实际操作 4.其它指导教师系(部)主任注:1、此表一组一表二份,课程设计小组组长一份;任课教师授课时自带一份备查
3、。2、课程设计结束后与“课程设计小结”、“学生成绩单”一并交院教务存档。摘要随着现今科学技术的发展,人们生活水平的提高,娱乐已必不可少,人们通过音乐陶冶情操,放松自己,这大大促进了媒体软件的发展.而mp3作为一种小巧,具有良好的音频解码能力,成为了最为广泛使用的音频格式。而软件市场的媒体播放器有很多,如酷狗音乐。目前常见的多媒体软件应该说各有特色,但是几乎每一个都存在着不如人意的地方。本课程设计所做的的播放器是基于MFC集成开发环境,利用系统的MCI(mediacontrollerinterface)命令接口来编程,具有体积小,支持的播放格式多、系统资源占用少、支持播放列表编辑。了解播放器的功
4、能实现,掌握播放器开发的相关技术,同时利用软件工程的相关理论知识,了解软件开发的方法与步骤关键字:音乐,MCI,播放器目录一 引言-6 1.1 MFC简介-6 1.2 MCI简介-6二 课程设计的目的与要求-72.1 目的-7 2.2 任务-7三 课题的需求分析-7 3.1 播放器的基本控制需求-7 3.2 功能需求-8四 概要设计-8五 详细设计-9六 调试与测试分析-10七 用户手册-11八 结论-11九 参考文献-12十 附录-13 正文一引言MP3播放器的设计是利用MFC应用程序、媒体控制接口MIC的基本知识而设计的。1.1 MFC简介 MFC是Visual C+是核心。MFC(Mic
5、rosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个c+类库, MFC类库将所有图形用户界面的元素如窗口、菜单和按钮等都以类的形式进行了封装,MFC AppWizard向导根据继承性利用MFC派生出自己的类,并对Windows应用程序进行了分解,利用MFC派生类对应用程序重新进行组装,同时还规定了应用程序中各个MFC派生类对象之间的相互联系,实现了标准Windows应用程序的功能,这就是向导生成的所谓MFC应用程序框架。这样就可以专心的考虑程序的逻辑,而不是这些每次编程都要重复的东西。1.2 MCI简介MCI是一种接口,MCI是我们只需要使用MCI函数而不
6、必考虑具体的多媒体设备,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。它所支持的媒体格式包括mp3、avi、wav、mpeg等等2。这样程序员不再需要关心具体设备的差异,就可以对激光唱机(CD)、视盘机、波形音频设备、视频播放设备和MIDI设备等媒体设备进行控制。应用程序通过MCI发送相应的命令来控制媒体设备。MCI分为命令字符串和命令消息两种,两者具有类似的功能。命令字符串具有使用简单的特点,但是它的执行效率略低于命令消息。二课程设计的目的与要求2.1 目的利用VC+开发一个支持wav、mp3、wma等不同音频格式的媒体播放
7、器。通过课程设计掌握多媒体编程的基本原理。2.2 任务1) 编程实现一个可支持多种音频格式的媒体播放器,其基本功能包括媒体播放、音量调节、播放进度选择、暂停、停止以及歌曲信息的查询与添加等;2) 给出程序的总体设计和详细设计,要求程序总体架构图、详细设计的流程图,函数、变量说明等3) 给出程序运行、测试的详细结果。三课题的需求分析(数据流图、数据字典)分析软件设计的目标和任务,确定软件功能和性能需求。软件需求是指用户对目标软件系统在功能、性能、行为、设计约束等方面的期望。需求分析就是通过对应用问题及其坏境的分析与理解采用一系列的分析方法和技术将用户的需求逐步精确化、完全化、一致化,最终形成需求
8、规模说明文档的过程。3.1 播放器的基本控制需求在着手开发系统之前首先要明确该系统应该实现的一些最基本的功能,然后逐步细化,为每个功能创建一个模块,再对各个模块进行开发。通过分析我们得出一款音乐播放器的基本控制如图(1)所示:音频播放器播放/暂停曲目控制音量控制添加/删除图(1):音乐的基本控制32 功能需求功能需求规定开发人员必须在产品中实现的软件功能,用户利用这些功能来完成任务,满足业务需求。功能需求有时也被称作行为需求 (behavioral requirement),因为习惯上总是用“应该”对其进行描述。功能需求描述开发人员需要实现什么。本次课程设计要求当用户启动程序进入主界面,用户可
9、以通过添加模块添加本地歌曲。通过播放列表用户可以实现对歌曲的查找、播放、暂停、音量调节、静音。通过总结我们知道其功能模块时序图如下图(2)所示:主界面打开选择播放控制回到主界面图(2):音频播放器的功能需求四概要设计(系统层次结构图)概要设计定义软件各主要成份之间的关系。在需求明确、准备开始编码之前,要做概要设计。设计软件结构的具体任务是:将一个复杂系统按功能进行模块划分、建立模块的层次结构及调用关系、确定模块间的接口及人机界面等。数据结构设计包括数据特征的描述、确定数据的结构特性、以及数据库的设计。本程序采用模块化软件设计,自顶向下逐层把软件系统划分成若干模块。每个模块完成一个特定的功能,最
10、后将所有模块按照某种方法组合成一个整体,达到整个播放器所要求的功能。本次课程设计的系统结构图如图(3)所示。 播放/暂停播放控制停止上一曲/下一曲文件控制打开文件播放器播放列表显示播放进度进度控制调整播放进度声音控制音量大小控制图(3):系统的层次结构图五详细设计(程序流程图)把软件系统结构成份转换成软件的过程性描述(算法),用程序流程图详述主要事件的实现过程。然后进行编码-根据这种过程性描述,编写核心源代码。本次课程设计所做音频播放器不仅要实现对一些常见的音频格式文件的播放,而且还要有友好的用户界面。其设计目标是:实现对多种音频格式文件的播放,当前播放曲目长度显示,实现音量控制;播放器软件占
11、用系统资源少、运行平台要求不高、界面美观舒适、操作简单。主要划分为以下4个功能模块,每个功能模块的作用描述如下:1) 播放控制:控制歌曲的播放状态,如:播放、暂停、上一曲、下一曲。播放过的歌曲按播放顺序排列在播放列表中,每次退出程序、重启播放器后播放列表中的播放记录会自动保存不会清空。2) 文件控制:主要用来打开本地播放文件。本音乐播放器支持常见音频格式文件播放如:MP3、WMA、WAV等。还有对播放列表进行控制如:打开文件所在目录、移除列表、删除文件。3) 进度控制:显示当前歌曲的播放总时长和已播放时长,可以通过鼠标调整歌曲的播放进度,实现歌曲的跳跃式播放。其实现方式是通过进度条和时间的同步
12、显示。4) 声音控制:调整歌曲音量的大小。界面布局设计(1) 创建一个对话框类,类名为CMPlayerDlg。(2) 向对话框中添加Group Box控件、Static Text控件以及按钮控件。(3) 设置所添加的控件的属性。系统界面的运行结果如图(4)所示。图(4):系统界面的运行结果图六调试及测试分析在课程设计中,常常遇到许许多多的问题,例如有些非控件变量的声明,这经常导致程序运行错误。这就要在变量声明处重新声明变量,调试过程中要经常使用在错误区域设置断点的方法来看看是否是是这段程序出了问题而不是,别的方面。七用户手册 本次课设所设计的程序简单,易用,跟大多数音频软件一样。在启动程序是需
13、要按添加音乐按钮添加自己喜欢的音乐,然后选择相应的歌曲,模式,点击播放,美妙的音乐就喷薄而出了,在主界面还可以进行跳跃式听歌,音量控制等各种操作。简而言之此款软件操作简单,集小巧,易用于一身。八结论经过为期两周的综合程序课程设计,我学到了很多。我对VC+这门课程有了更深刻的认识,对用MFC创建基于对话框的应用程序更加熟悉,同时了解了MCI相关知识。本次课程设计中虽然可以实现播放、暂停、停止、播放界面美化以及音量等功能,但仍然存在着放多不足,添加音乐列表后再次启动不能保留数据。课设中遇到了许多的困难,课设中第一次调试程序时出现了很多错误,其中有逻辑错误,编译能通过,运行始终无法通过,后来经过思考
14、,进行了多次修改调试之后得到了运行结果;但还是存在兼容性问题,系统版本以及软件的版本之间存在各种兼容性问题,这使我不知从何处检查并改进,后来在老师的帮助下,意识到可能是兼容性的问题,结果换了台电脑,经过改正调试最终达到了目的。诸如此类的问题数不胜数,不过经过查询资料,咨询老师,与同学探讨最终完成了这次课设,成功的做出了音频播放器。“书到用时方恨少”,只是到要用的时候,才会觉得这句话是真理。以前玩的时候不觉得,只有真正做事时,抓耳挠腮时才会觉得以前学的不够好。虽然在设计的过程中,时常会碰到问题,有时是从网上搜索出解决方法,但是往往大多数百度也不能找到有效的解决办法,这种时候,向同学老师请教,就会
15、让自己受益很多。跟老师和同学的交流使我认识的自己的更多不足,这些都是值得我改进的。总的说来,此次软件设计,让我深刻认识的不足,以后会更加努力。参考文献1 黄维通.Visual C+面向对象编程教程.第三版.北京:清华大学出版社,20112 侯俊杰.深入浅出MFC.第2版.广东:南方出版社,20073 严华峰等.Visual C+课程设计案例精编.北京:中国水利水电出版社,20044 王维玉等.Visual C+高级编程技术精粹.北京:科学出版社,20085陈国建等.Visual C+范例开发大全.北京:清华大学出版社,2010九附录初始化程序 / MPlayerDlg.cpp : 实现文件/#
16、include stdafx.h#include MPlayer.h#include MPlayerDlg.h#include afxdialogex.h#ifdef _DEBUG#define new DEBUG_NEW#endif/ CMPlayerDlg 对话框CMPlayerDlg:CMPlayerDlg(CWnd* pParent /*=NULL*/): CDialogEx(CMPlayerDlg:IDD, pParent)m_hIcon = AfxGetApp()-LoadIcon(MAKEINTRESOURCE(IDI_ICON);hour=0;minute=0;second=0
17、;cs=0;ch=0;cm=0;mode=SINGLE;void CMPlayerDlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST, list);DDX_Control(pDX, IDC_SLIDER_VOL, vol);DDX_Control(pDX, IDC_SLIDER_TIME, process);BEGIN_MESSAGE_MAP(CMPlayerDlg, CDialogEx)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON
18、_WM_ERASEBKGND()ON_LBN_SELCHANGE(IDC_LIST, &CMPlayerDlg:OnLbnSelchangeList)ON_BN_CLICKED(IDC_PLAY, &CMPlayerDlg:OnBnClickedPlay)ON_BN_CLICKED(IDC_ADD, &CMPlayerDlg:OnBnClickedAdd)ON_BN_CLICKED(IDC_PAUSE, &CMPlayerDlg:OnBnClickedPause)ON_BN_CLICKED(IDC_STOP, &CMPlayerDlg:OnBnClickedStop)ON_BN_CLICKED
19、(IDC_DELETE, &CMPlayerDlg:OnBnClickedDelete)ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_VOL, &CMPlayerDlg:OnCustomdrawSliderVol)ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_TIME, &CMPlayerDlg:OnCustomdrawSliderTime)ON_WM_TIMER()ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_TIME, &CMPlayerDlg:OnReleasedcaptureSliderTime)O
20、N_BN_CLICKED(IDC_BTN_NEXT, &CMPlayerDlg:OnBnClickedBtnNext)ON_BN_CLICKED(IDC_BTN_BACK, &CMPlayerDlg:OnBnClickedBtnBack)ON_LBN_DBLCLK(IDC_LIST, &CMPlayerDlg:OnDblclkList)ON_BN_CLICKED(IDC_BTN_MODE, &CMPlayerDlg:OnBnClickedBtnMode)END_MESSAGE_MAP()/ CMPlayerDlg 消息处理程序BOOL CMPlayerDlg:OnInitDialog()CDi
21、alogEx:OnInitDialog();/ 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动/ 执行此操作SetIcon(m_hIcon, TRUE);/ 设置大图标SetIcon(m_hIcon, FALSE);/ 设置小图标/ TODO: 在此添加额外的初始化代码process.SetRange(0,100);vol.SetRange(0,1000);vol.SetPos(vol.GetRangeMax();CString temp;temp.Format( %d:%d:%d / %d:%d:%d,ch,cm,cs,hour,minute,second);SetDlgIte
22、mText(IDC_STATIC_TIME,temp);return TRUE; / 除非将焦点设置到控件,否则返回 TRUE/ 如果向对话框添加最小化按钮,则需要下面的代码/ 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,/ 这将由框架自动完成。播放程序void CMPlayerDlg:OnBnClickedPlay()CString temp;GetDlgItemText(IDC_PAUSE,temp);if(temp.Compare(继续播放)=0)SetDlgItemText(IDC_PAUSE,暂停); CString filename;int index=list.Ge
23、tCurSel();if(index=-1)MessageBox(请添加或选择);return;list.GetText(index,filename);SetDlgItemText(IDC_FILENAME,filename);player.Stop();player.Open(m_hWnd,filename);player.Play();KillTimer(0);SetTimer(0,1000,NULL);hour=minute=second=ch=cm=cs=0;temp.Format( %d:%d:%d / %d:%d:%d,ch,cm,cs,hour,minute,second);S
24、etDlgItemText(IDC_STATIC_TIME,temp);process.SetPos(0);/ TODO: 在此添加控件通知处理程序代码添加音乐void CMPlayerDlg:OnBnClickedAdd()char fliter=音乐文件(*.mp3;*.wma;*.wav)0*.mp3;*.wma;*.wav0所有文件(*.*)0*.*00;CFileDialog fdlg(TRUE);fdlg.m_ofn.lpstrFilter=fliter;if(IDOK=fdlg.DoModal()CString path=fdlg.GetPathName();CString fi
25、le=fdlg.GetFileName();list.InsertString(list.GetCount(),path);list.SetCurSel(list.GetCount()-1);/ TODO: 在此添加控件通知处理程序代码暂停音乐void CMPlayerDlg:OnBnClickedPause()CString temp;GetDlgItemText(IDC_PAUSE,temp);if(temp.Compare(暂停)=0)player.Pause();SetDlgItemText(IDC_PAUSE,继续播放);KillTimer(0); else if(temp.Comp
26、are(继续播放)=0)player.resume();SetDlgItemText(IDC_PAUSE,暂停);SetTimer(0,1000,NULL); / TODO: 在此添加控件通知处理程序代码停止void CMPlayerDlg:OnBnClickedStop()KillTimer(0);CString temp;GetDlgItemText(IDC_PAUSE,temp);if(temp.Compare(继续播放)=0)SetDlgItemText(IDC_PAUSE,暂停); player.Stop();hour=0;minute=0;second=0;ch=0;cm=0;cs
27、=0;temp.Format( %d:%d:%d / %d:%d:%d,ch,cm,cs,hour,minute,second);SetDlgItemText(IDC_STATIC_TIME,temp);process.SetPos(0);/ TODO: 在此添加控件通知处理程序代码删除void CMPlayerDlg:OnBnClickedDelete()list.DeleteString(list.GetCurSel();/ TODO: 在此添加控件通知处理程序代码滑动音量控制void CMPlayerDlg:OnCustomdrawSliderVol(NMHDR *pNMHDR, LRE
28、SULT *pResult)LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR);/ TODO: 在此添加控件通知处理程序代码volume=vol.GetPos();player.SetVolume(volume);CString Vtemp;Vtemp.Format(音量 %d%,volume/10);SetDlgItemText(IDC_STATIC_VOL,Vtemp);*pResult = 0;时间void CMPlayerDlg:OnCustomdrawSliderTime(NMHDR *pNMHDR, LRESULT *pResult)LP
29、NMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR);/ TODO: 在此添加控件通知处理程序代码*pResult = 0;void CMPlayerDlg:OnTimer(UINT_PTR nIDEvent)CString temp;/ TODO: 在此添加消息处理程序代码和/或调用默认值if(nIDEvent=0)int index;totaltime=player.info(MCI_STATUS_LENGTH);currenttime=player.info(MCI_STATUS_POSITION);if(currenttime=totaltime)
30、switch(mode)case SINGLE:player.SeekTo(0);OnBnClickedStop();break;case R_SINGLE:player.SeekTo(0);OnBnClickedPlay();break;case ALL:index=list.GetCurSel();if(indexlist.GetCount()-1)OnBnClickedBtnNext();elseplayer.SeekTo(0);OnBnClickedStop();break;case R_ALL:index=list.GetCurSel();if(indexlist.GetCount(
31、)-1)OnBnClickedBtnNext();elselist.SetCurSel(0);OnBnClickedPlay();break;return; totaltime=totaltime/1000; hour=totaltime/3600; minute=(totaltime/60)%60; second=totaltime%60;currenttime=currenttime/1000;process.SetPos(currenttime*100)/totaltime);ch=currenttime/3600;cm=(currenttime/60)%60;cs=currenttim
32、e%60;temp.Format(%d:%d:%d / %d:%d:%d,ch,cm,cs,hour,minute,second);SetDlgItemText(IDC_STATIC_TIME,temp);CDialogEx:OnTimer(nIDEvent);void CMPlayerDlg:OnReleasedcaptureSliderTime(NMHDR *pNMHDR, LRESULT *pResult)/ TODO: 在此添加控件通知处理程序代码SetTimer(0,1000,NULL);CString temp;GetDlgItemText(IDC_PAUSE,temp);DWOR
33、D time=player.info(MCI_STATUS_LENGTH);DWORD currenttime;currenttime=time*(process.GetPos()/100;player.SeekTo(currenttime);player.Play();if(temp.Compare(继续播放)=0)SetDlgItemText(IDC_PAUSE,暂停); *pResult = 0;返回void CMPlayerDlg:OnBnClickedBtnBack()int index;index=list.GetCurSel();index-=1;if(index0)Messag
34、eBox(没有音乐|);return;list.SetCurSel(index);OnBnClickedPlay();/ TODO: 在此添加控件通知处理程序代码列表void CMPlayerDlg:OnDblclkList()OnBnClickedPlay();/ TODO: 在此添加控件通知处理程序代码模式void CMPlayerDlg:OnBnClickedBtnMode()switch(mode)case SINGLE:mode=R_SINGLE;SetDlgItemText(IDC_BTN_MODE,播放模式:单曲循环);break;case R_SINGLE:mode=ALL;SetDlgItemText(IDC_BTN_MODE,播放模式:全部播放);break;case ALL:mode=R_ALL;SetDlgItemText(IDC_BTN_MODE,播放模式:全部循环);break;case R_ALL:mode=SINGLE;SetDlgItemText(IDC_BTN_MODE,播放模式:单曲播放);break;/ TODO: 在此添加控件通知处理程序代码