专业课程设计.docx
- 文档编号:3916549
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:13
- 大小:29.88KB
专业课程设计.docx
《专业课程设计.docx》由会员分享,可在线阅读,更多相关《专业课程设计.docx(13页珍藏版)》请在冰豆网上搜索。
专业课程设计
目录
1多媒体原理与应用…………………………………………………………………………1
1.1多媒体信息的主要元素…………………………………………………………………1
1.2多媒体技术的主要特点…………………………………………………………………1
1.3常见多媒体格式…………………………………………………………………………1
2系统设计方案………………………………………………………………………………3
2.1利用MFCAppWinzard生生成应用程序框架……………………………………………3
3程序运行图…………………………………………………………………………………9
4播放器设计原理……………………………………………………………………………9
5总结与心得…………………………………………………………………………………11
6参考文献……………………………………………………………………………………12
1多媒体原理与应用
1.1多媒体信息的主要元素
文本包含字母、数字、字、词等基本元素。
多媒体系统除具备一般的文本处理功能外,还可应用
人工智能技术对文本进行识别、理解、摘编、翻译、发音等。
超文本是超媒体文档不可缺少的组成部分。
超文本是对文本索引的一个应用,它能在一个或多个文档中快速地搜索特定的文本内容。
图形(Graph)与图像(Image)都是多媒体中的可视元素,它们有矢量图(VectorDrawn)和位图(bitmap)两种形式。
矢量图常用于框架结构的图形处理,它的应用很广泛,如计算机辅助设计(CAD)系统中常用向量图来描述十分复杂的几何图形。
适用于直线、方框、圆或多边形,以及其他
可用角度,座标和距离来表示的那些图形。
位图是由图像中各个像素点组成,这些存储位定义了各像
素点的颜色和亮度。
对位图的描述与分辩率和色彩的颜色种数有关,分辨率与色彩位数越高,占用存储空间就越大。
在多媒体技术中,视频(Video)是一项重要的媒体。
图像与视频是两个既有联系又有区别的概念。
一般而言,静止的图片称为图像。
动态的影视图像称为视频。
静态图像的输入要靠扫描仪、数字照像机等,而视频信号的输入只能是摄像机、录像机、影碟机以及电视接收机等可以输出连续图像信号的设备。
动画(Animation)是采用计算机动画软件创作并生成的一系列可供实时演播的连续画面。
计算机动画目前成功地用于广告业与影视业,尤其是将动画用于电影特技,使电脑动画技术与实拍画面相结合,真假难辨,取得了空前的成功。
音频(Audio)是指大约在15∼20000Hz的频率范围的连续变化的波形。
音频技术在多媒体中的应用极为广泛,多媒体涉及到多方面的音频处理技术,如:
音频采集:
把模拟信号转换成数字信号;
语音编/解码:
把语音数据进行压缩编码,解压缩;
音乐合成:
利用音乐合成芯片,把乐谱转换成乐曲输出;
文/语转换:
将计算机的文本转换成声音输出;
语音识别:
让计算机能够听懂人的语音。
1.2多媒体技术的主要特点
集成性:
一方面是媒体信息的集成,另一方面是显示或表现媒体设备的集成。
实时性:
声音、视频图像、动画等媒体是强实时的,多媒体系统提供了对这些时基媒体实时处理的能力。
交互性:
多媒体计算机与其他家用声像电器有多差别的关键特征,普通家用声像电器无交互性,即用户只能被动收看,而不能介入到媒体的加工和处理之中。
1.3常见多媒体格式
波形音频是一种电子数字化声音,是计算机播放音频的一种重要的形式,它存储的声音的波形信息,特点是:
当播放播形音频时,不管播放文件的设备是何种类型,都会得到相似的声音。
波形音频文件通常以.wav作为文件扩展名。
由于采用波形音频存储电子需要大量的存储空间,因此它一般只用于短时间的声音播放。
MIDI(MusicalInstrumentDigitalInterface)在多媒体音频中占有重要的位置,是播放和录制音乐的国际标准,它确定了连接音乐设备的电缆线、硬件和通信协议。
多媒体计算机只需具有MIDI接口声卡和MIDI合成器,就具有处理MIDI的功能。
MIDI在处理音乐时是将MIDI音乐设备上产生的活动编码记录下来,将这些数据传递到MIDI合成器上就能中现原来的演奏。
MIDI的消息有两种类型:
状态字节和数字字节。
状态字节描述发送的类别(动作和函数),数字字节总是跟在状态字节后,表示发送消息的实际值。
数值字节的个数取决于状态字节表示的消息类型。
MIDI通过通道字节最高位区别这两种类型。
最高位为1表示状态字节,最高位为0表示数字字节。
CD音频采用红皮书标准,通过CD-ROM驱动器来播放CD音频。
CD音频需要的存储量大,一张光盘大约能够存储10首歌,70分钟音频左右。
在一般情况下,整个光盘都用来存储CD音频数据,并划分为多个音轨,轨道的具体长度可以不定,通常一个音轨对应一首曲目。
CD音频的长度由分、秒、帧的形式来衡量,最小的单位为帧,每一帧为1/75秒,一分等于60秒。
数字视频(DigitalVideo)使用数据信息在计算机上实现动画的效果,它是利用人眼睛的视觉暂留形成的,使人们连续图像效果所需的最低播放速度是24幅/秒,播放速度越快,数字视频给人的视觉连续性效果越好。
存储视频影像需要巨大的磁盘空间,一般来讲,1秒钟全屏视频信号需要大约28MB的空间。
为了实现连续的视频播放,不仅需要有足够的空间来存储视频音像信息,还需要保证硬盘有28MB/秒的传播速度。
Audio_Video_Interleaved(AVI)文件格式是由微软提出的在WINDOWS下存储视频信息的标准。
AVI文件以一系列的位图来村存储视频信息,并同时在文件中假如一数字形式存储数字化视频信息,它实际上由一组信息流组成的文件。
2系统设计方案
2.1利用MFCAppWinzard生成应用程序框架
(1)执行VC程序,选择File|New命令,弹出New对话框.单击Projects标签,转到Projects选项卡,选择MFCAppWizard(exe)选项,然后在Projectname文本框中输入文件名。
Lacation文本框是指项目的本地路径。
(2)单击OK按钮,弹出MFCAppWinzard_Step1对话框。
选中基本对话框。
最后单击Finish按钮,创建框架。
(3)在对话框窗体上添加播放器用到的按钮控件,对话框和位图;以及对应需要用到的成员变量和成员函数。
(4)添加消息处理函数
voidCMyPlayerDlg:
:
OnBtnOpen()//打开
{
CStringstrFilter="所有支持文件(*.mp3,*.wav,*.wma)|*.mp3;*.wav;*.wma||";
CFileDialogfdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,strFilter);
if(fdlg.DoModal()==IDOK){
CStringstrFileName=fdlg.GetPathName();
m_strPlayListArray.RemoveAll();
m_strPlayListArray.Add(strFileName);
CStringstrList,strFile;
strFile=GetFileTitle(strFileName);
strList.Format("01%s",strFile);
m_pPlayListDlg->m_playlist.ResetContent();
m_pPlayListDlg->m_playlist.AddString(strList);
Play(0);
}
}
voidCMyPlayerDlg:
:
OnBtnNext()//上一首
{
//TODO:
Addyourcontrolnotificationhandlercodehere
if(m_strPlayListArray.GetSize()==0)
return;
m_nNowPlaying++;
if(m_nNowPlaying>=m_strPlayListArray.GetSize())
m_nNowPlaying=0;
Play(m_nPlayOrder[m_nNowPlaying]);
}
voidCMyPlayerDlg:
:
OnBtnPlay()//播放
{
//TODO:
Addyourcontrolnotificationhandlercodehere
intn=m_pPlayListDlg->m_playlist.GetCurSel();
if(n<0){
if(m_strPlayListArray.GetSize()>0){
Play(m_nPlayOrder[0]);
m_nNowPlaying=0;
}
return;
}
Play(n);
if(m_nPlayMode==MODE_RAND){
for(inti=0;i if(m_nPlayOrder[i]==n){ m_nNowPlaying=i; break; } } }else{ m_nNowPlaying=n; } } voidCMyPlayerDlg: : OnBtnPrev()//下一首 { //TODO: Addyourcontrolnotificationhandlercodehere if(m_strPlayListArray.GetSize()==0) return; m_nNowPlaying--; if(m_nNowPlaying<0) m_nNowPlaying=m_strPlayListArray.GetSize()-1; Play(m_nPlayOrder[m_nNowPlaying]); } voidCMyPlayerDlg: : OnBtnStop()//停止 { //TODO: Addyourcontrolnotificationhandlercodehere if(hAudio! =NULL){ MCIWndStop(hAudio); m_nTime=0; fPlaying=FALSE; strTime="00: 00"; m_slide.SetSlidePos(0); InvalidateRect(&rectTime,TRUE); } } voidCMyPlayerDlg: : OnClose()//退出 { //TODO: Addyourcontrolnotificationhandlercodehere ExitPlayer(); } voidCMyPlayerDlg: : OnClose() { //TODO: Addyourcontrolnotificationhandlercodehere ExitPlayer(); } voidCMyPlayerDlg: : OnList()//播放列表 { //TODO: Addyourcontrolnotificationhandlercodehere if(m_pPlayListDlg! =NULL) if(m_pPlayListDlg->IsWindowVisible()){ m_pPlayListDlg->ShowWindow(SW_HIDE); m_btnPLShow.SetBitmap(IDB_PLAYLIST_SHOW_NORMAL,IDB_PLAYLIST_SHOW_OVER); m_btnPLShow.SetToolTipText("显示播放列表"); }else{ m_pPlayListDlg->ShowWindow(SW_SHOW); m_btnPLShow.SetBitmap(IDB_PLAYLIST_HIDE_NORMAL,IDB_PLAYLIST_HIDE_OVER); m_btnPLShow.SetToolTipText("关闭播放列表"); } } voidCMyPlayerDlg: : OnLyric()//打开和关闭歌词对话框 { //TODO: Addyourcontrolnotificationhandlercodehere if(m_pLyricDlg! =NULL){ if(m_pLyricDlg->IsWindowVisible()){ m_pLyricDlg->ShowWindow(SW_HIDE); m_btnLyric.SetBitmap(IDB_LYRIC_SHOW_NORMAL,IDB_LYRIC_SHOW_OVER); m_btnLyric.SetToolTipText("打开歌词"); }else{ m_pLyricDlg->ShowWindow(SW_SHOW); m_btnLyric.SetBitmap(IDB_LYRIC_HIDE_NORMAL,IDB_LYRIC_HIDE_OVER); m_btnLyric.SetToolTipText("关闭歌词"); } } } voidCMyPlayerDlg: : OnBtnVolume()//声音调教按钮 { //TODO: Addyourcontrolnotificationhandlercodehere m_nVolume=m_volume.GetPos(); intnSetVol=63*m_nVolume; if(nSetVol>1000) nSetVol=1000; if(hAudio! =NULL); MCIWndSetVolume(hAudio,nSetVol); } voidCMyPlayerDlg: : OnStaticMode()//播放状态控制 { //TODO: Addyourcontrolnotificationhandlercodehere staticintnCounter=0; nCounter++; if(nCounter==3) nCounter=0; switch(nCounter){ case0: m_stcMode.SetWindowText("随机"); m_nPlayMode=MODE_RAND; theApp.RandOrder(); break; case1: m_stcMode.SetWindowText("顺序"); m_nPlayMode=MODE_SEQ; m_nNowPlaying=m_nPlayOrder[m_nNowPlaying]; theApp.SequenceOrder(); break; case2: m_stcMode.SetWindowText("单曲"); m_nPlayMode=MODE_SINGLE; break; } voidCMyPlayerDlg: : OnStaticPlay()//暂停 { //TODO: Addyourcontrolnotificationhandlercodehere if(hAudio==NULL) return; fPlay=! fPlay; if(fPlay){ m_stcPlay.SetWindowText("播放"); MCIWndResume(hAudio); } else{ m_stcPlay.SetWindowText("暂停"); MCIWndPause(hAudio); } } } CLyricDlg: : CLyricDlg(CWnd*pParent)//歌词对话框 : CDialog(CLyricDlg: : IDD,pParent) { //{{AFX_DATA_INIT(CLyricDlg) //NOTE: theClassWizardwilladdmemberinitializationhere //}}AFX_DATA_INIT m_pParent=pParent; m_nID=CLyricDlg: : IDD;//获得歌词对话框的ID } voidCLyricDlg: : DoDataExchange(CDataExchange*pDX) { CDialog: : DoDataExchange(pDX); //{{AFX_DATA_MAP(CLyricDlg) //NOTE: theClassWizardwilladdDDXandDDVcallshere //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CLyricDlg,CDialog) //{{AFX_MSG_MAP(CLyricDlg) ON_WM_CTLCOLOR() ON_WM_LBUTTONDOWN() ON_WM_TIMER() ON_WM_CREATE() ON_WM_DESTROY() ON_WM_MOVE() ON_WM_PAINT() ON_WM_RBUTTONDOWN() ON_COMMAND(IDC_HIDE_MAIN,OnHideMain) ON_COMMAND(IDC_HIDE_LYRIC,OnHideLyric) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// //CLyricDlgmessagehandlers BOOLCLyricDlg: : Create() { returnCDialog: : Create(m_nID,m_pParent);//创建歌词对话框 } voidCPlayListDlg: : OnAdd()//添加歌曲 { //TODO: Addyourcontrolnotificationhandlercodehere CRectrect; GetDlgItem(IDC_BTN_ADD)->GetWindowRect(&rect); CMenum_Menu; m_Menu.LoadMenu(IDR_MENU_ADD); m_Menu.GetSubMenu(0)->TrackPopupMenu(TPM_RIGHTBUTTON, rect.left,rect.bottom,this,NULL); } voidCPlayListDlg: : OnDel()//删除歌曲 { //TODO: Addyourcontrolnotificationhandlercodehere CRectrect; GetDlgItem(IDC_BTN_DEL)->GetWindowRect(&rect); CMenum_Menu; m_Menu.LoadMenu(IDR_MENU_DEL); m_Menu.GetSubMenu(0)->TrackPopupMenu(TPM_RIGHTBUTTON, rect.left,rect.bottom,this,NULL); } 3程序运行图 4播放器设计原理 MCI(MediaControlInterface,媒体控制接口)向基于Windows操作系统的应用程序提供了高层次的控制媒体设备接口的能力。 程序员不再需要关心具体设备的差异,就可以对激光唱机(CD)、视盘机、波形音频设备、视频播放设备和MIDI设备等媒体设备进行控制。 对于程序员来说,可以把MCI理解为设备面板上的一排按键,通过选择不同的按键(发送不同的MCI命令)可以让设备完成各种功能,而不必关心设备内部如何实现。 比如,对于play,视盘机和CD机有不同的反应(一个是播放视频,一个播放音频),而对用户来说却只需要按同一按钮。 应用程序通过MCI发送相应的命令来控制媒体设备。 MCI分为命令字符串和命令消息两种,两者具有类似的功能。 命令字符串具有使用简单的特点,但是它的执行效率略低于命令消息。 所有的MCI命令字符串都是通过多媒体API函数mciSendString传递给MCI的,该函数的声明为: MCIERRORmciSendString( LPCTSTRlpszCommand,//MCI命令字符串 LPTSTRlpszReturnString,//存放反馈信息的缓冲区 UINTcchReturn,//缓冲区的长度 HANDLEhwndCallback//回调窗口的句柄,一般为NULL );//若成功则返回0,否则返回错误码。 该函数返回的错误码可以用mciGetErrorString函数进行分析,该函数的声明为: BOOLmciGetErrorString( DWORDfdwError,//函数mciSendString或mciSendCommand返回的错误码 LPTSTRlpszErrorText,//接收描述错误的字符串的缓冲区 UINTcchErrorText//缓冲区的长度 ); 消息数据的主要用法是,把消息数据结构中的成员赋予相应值,然后通过mciSendCommand函数把此消息数据按传地址方式传过去,操作成功后就可以查看该消息数据中的你需要的内容,当然每个消息的成员的数据成员都有可能不一样,在这里列出所有的消息结构显得不太合适,MSDN已经很完善了。 这里我还要提一下的就是MCI_DGV_STATUS_PARMS这个消息书籍结构,它可以用于多个地方,例如查看播放速度、获得视频现在的播放位置等等,这个结构中的两个成员dwItem和dwReturn很有意思,例如你将dwItem赋值为MCI_STATUS_POSITION时,得到dwReturn的值是视频现在的播放位置,而当你dwItem赋值为MCI_DGV_STATUS_SPEED时,得到dwReturn的值是视频的播放速度。 其实MCI编程并不难,比较烦人的地方就是它有太多的参数要记,而这么多参数中又有很多不同的数据结构,解决的唯一办法就是多练习多记,只有在熟悉大部分数据结构的基础上才能在MCI编程里面游刃有余。 该程序基本完成了一个播放器需要的基本功能,能显示进度条能通过进度条的拖动到歌曲相应位置,但是不足之处也是很多,首先一些空间在刷过背景图后成了白色的块块影响美观,没有完成连续播放,随机播放,单曲循环等等,没有实现音量的变化,在时间的位置没有把秒转化为分钟: 秒的样子,由于时间的原因从原先不会mci到现在懂得了点皮毛并作出了个播放器,我觉得我收获还是挺大的,通过这个程序以及这一周来的时间做的课程设计,我对对话框的编程又有了更深入的认识
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 专业课程 设计