版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验六媒体播放器实现1.上机实验报告六课程名称:多媒体技术班级:数媒**班实验日期:2014.5.25-6.2小组成员:指导教师:实验序号:06实验成绩:一、简单媒体播放器实现实验目的及要求目的:使用VC++2005进行编程,基于控制台应用程序,使用DirectShowSDK实现流媒体播放器。要求:1、掌握使用DirectSound中常用接口完成音视频媒体回放、显示及控制等动作的方法;2、利用接口中的控制函数完成控制操作;3、学会面向对象的设计方法;3、开发一个简单的基于控制台应用程序的媒体播放程序。三、实验环境本次上机实践所使用的平台和相关软件VS2012MFC\win7实验内容平台搭建DirectX是一个多媒体API,提供了与显卡、声卡、输入设备等进行交互的标准接口。如果没有这个标准API,则将必须为每个显卡和声卡组合以及每种类型的键盘、鼠标和手柄编写不同的代码。而DirectShow是微软为简化或降低音频/视频开发的难度而为音视频应用开发人员定制的一套API函数。是DirectX的一个组件,提供对多媒体数据流的高质量捕获和回放。不必关注视频硬件如显卡、视频捕捉设备、视频编码算法、解码算法,音/视频数据同步等复杂细节。此次在VS下媒体播放器的实现即需要DirectShow的有关静态库的配置和开发环境的配置。由于VS2012无需配置DirectX,用户可直接编译DirectShow里的baseclasses,选择成批编译,生成四个版本的静态库Debug、Debug_Unicode、Release、Release_Unicode。为了能让VSc++自动搜索到SDK库和头文件,需对媒体播放工程进行环境配置。(1)在include路径下添加DirectShow中的BaseClasses\、include、Common。(2)在lib路基下添加DirectShow中的Debug、Debug_Unicode、Release、Release_Unicode。实现的基本功能:打开/关闭媒体文件播放/暂停/停止媒体全屏显示音量控制抓图静音控制播放时总位于顶层增加的功能:屏幕缩放比例退出播放时长的显示未来扩展功能:希望实现前一个、下一个视频的播放
3.功能介绍:点击“打开”,添加播放资源*.mpg;*.mpeg;*.avi;*.rmvb;*.rm;*.mp3;*.mid;*.wav;*.mov;*.qt;*.wmv;*.wma;*.asf2、单击“播放”,开始播放或重新播放3、点击“暂停”,暂停播放视频(只在视频播放时才可以生效);4、单击“终止”,视频播放停止(只在视频播放时才可以生效);5、滑动音量滑块调节音量大小(有左声道和右声道)6、可以选择menu的各个功能,如抓图,缩放,全屏,退出,帮助里的关于等。调试过程及实验结果实验效果图:总结通过这次实验,体会到了DirectShow的强大功能,为用户开发节省了很多时间。例如DirectShow的视频窗口接口有专门的方法支持全屏显示功能,因此我们只需boolCDXGraph::SetFullScreen(BOOLinEnabled){ if(pVideoWindow) { HRESULThr=pVideoWindow->put_FullScreenMode(inEnabled?OATRUE:OAFALSE); returnSUCCEEDED(hr); } returnfalse;}即可实现全屏显示的功能。但是不足的是我未能使用GraphEdit管理滤波器的插入、连接和运行,快速构建一个使用DitectShow的滤波器链表。在链接滤波器引脚时,无法链接。主要原因是对GraphEdit不是很熟悉,时间来不及。附录核心代码:voidCDSPlayerDlg::OnFileOpenQuick(){ CStringstrFilter; strFilter="媒体文件(所有类型)|*.mpg;*.mpeg;*.avi;*.rmvb;*.rm;*.mp3;*.mid;*.wav;*.mov;*.qt;*.wmv;*.wma;*.asf|"; strFilter+="AllFiles(*.*)|*.*|"; CFileDialogdlgOpen(TRUE,NULL,NULL,OFN_PATHMUSTEXIST|OFN_HIDEREADONLY, strFilter,this); if(IDOK==dlgOpen.DoModal()) { PlayFile(dlgOpen.m_ofn.lpstrFile); }}voidCDSPlayerDlg::OnSize(UINTnType,intcx,intcy){ CDialog::OnSize(nType,cx,cy); CRectrc; GetClientRect(&rc); rc.top=rc.bottom-m_Bar.GetHeight(); m_Bar.MoveWindow(&rc); GetClientRect(&rc); rc.bottom-=m_Bar.GetHeight(); m_videowindow.MoveWindow(&rc); if(m_pGraph) { CRectrc; GetClientRect(&rc); rc.bottom-=m_Bar.GetHeight(); m_videowindow.MoveWindow(&rc); m_pGraph->SetWindowPos(&rc); } DrawLogo();}voidCDSPlayerDlg::OnFileClose(){ DestroyGraph(); m_Bar.EnableToolButton(false); m_Bar.EnableSlider(false); SetTimer(TIMER_DRAWLOGO,10,NULL); m_Bar.DrawStatusBar(); SetWindowText("MediaPlayerClassic");}voidCDSPlayerDlg::OnFileShot(){ CTimet=CTime::GetCurrentTime(); CStrings=t.Format("D:\\%y_%m_%d_%H_%M_%S.BMP"); if(m_pGraph->SnapshotBitmap(s)) MessageBox(CString("截图成功,保存为")+s);}voidCDSPlayerDlg::OnMenuSelect(UINTnItemID,UINTnFlags,HMENUhSysMenu){ CDialog::OnMenuSelect(nItemID,nFlags,hSysMenu); CCmdUIcmdUI;CMenu*pMainMenu=GetMenu();CMenu*pSubMenu=pMainMenu->GetSubMenu(nItemID);if(IsMenu(pSubMenu->GetSafeHmenu())){cmdUI.m_nIndexMax=pSubMenu->GetMenuItemCount();for(UINTi=0;i<cmdUI.m_nIndexMax;++i){cmdUI.m_nIndex=i;cmdUI.m_nID=pSubMenu->GetMenuItemID(i);cmdUI.m_pMenu=pSubMenu;cmdUI.DoUpdate(this,FALSE);}}}voidCDSPlayerDlg::OnClose(){ DestroyGraph(); CDialog::OnClose();}voidCDSPlayerDlg::OnPlay(){ if(m_pGraph) { m_pGraph->Play(); SetTimer(TIMER_POSITION,100,NULL); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_PLAY,TBSTATE_CHECKED|TBSTATE_ENABLED); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_PAUSE,TBSTATE_ENABLED); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_STOP,TBSTATE_ENABLED); m_Bar.EnableSlider(true); SetVolumeAndBalance(); m_Bar.DrawStatusBar(); }}voidCDSPlayerDlg::OnPause(){ if(m_pGraph) { m_pGraph->Pause(); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_PLAY,TBSTATE_ENABLED); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_PAUSE,TBSTATE_CHECKED|TBSTATE_ENABLED); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_STOP,TBSTATE_ENABLED); m_Bar.DrawStatusBar(); }}voidCDSPlayerDlg::OnStop(){ if(m_pGraph) { KillTimer(TIMER_POSITION); m_pGraph->SetPosition(0); m_pGraph->Stop(); m_Bar.SetSliderPos(0); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_PLAY,TBSTATE_ENABLED); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_PAUSE,TBSTATE_ENABLED); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_STOP,TBSTATE_CHECKED|TBSTATE_ENABLED); m_Bar.EnableSlider(false); m_Bar.DrawStatusBar(); }}voidCDSPlayerDlg::OnTimer(UINTnIDEvent){ switch(nIDEvent) { caseTIMER_POSITION: { if(m_pGraph) { __int64pos=m_pGraph->GetPosition(); __int64len=m_pGraph->GetLength(); m_Bar.SetSliderPos(int(pos*10000/len)); m_Bar.DrawStatusBar(); } break; } caseTIMER_DRAWLOGO:{ DrawLogo(); KillTimer(TIMER_DRAWLOGO); break; } } CDialog::OnTimer(nIDEvent);}voidCDSPlayerDlg::OnPlayFullScreen(){ if(m_pGraph) { m_videowindow.m_bDrawCursor=m_pGraph->GetFullScreen(); m_pGraph->SetFullScreen(!m_pGraph->GetFullScreen()); }}voidCDSPlayerDlg::OnUpdateFileShot(CCmdUI*pCmdUI){ if(m_pGraph) pCmdUI->Enable(m_pGraph->IsHaveVideo()); else pCmdUI->Enable(false);}voidCDSPlayerDlg::OnUpdateFileClose(CCmdUI*pCmdUI){ if(m_pGraph) pCmdUI->Enable(m_pGraph->IsPaused()||m_pGraph->IsRunning()||m_pGraph->IsStopped()); else pCmdUI->Enable(false);}voidCDSPlayerDlg::OnUpdateFileFullScreen(CCmdUI*pCmdUI){ if(m_pGraph) pCmdUI->Enable(m_pGraph->IsHaveVideo()); else pCmdUI->Enable(false);}voidCDSPlayerDlg::OnUpdatePause(CCmdUI*pCmdUI){ if(m_pGraph==NULL) { pCmdUI->Enable(false); return; } pCmdUI->Enable(); pCmdUI->SetCheck(m_pGraph->IsPaused());}voidCDSPlayerDlg::OnUpdatePlay(CCmdUI*pCmdUI){ if(m_pGraph==NULL) { pCmdUI->Enable(false); return; } pCmdUI->Enable(); pCmdUI->SetCheck(m_pGraph->IsRunning());}voidCDSPlayerDlg::OnUpdateStop(CCmdUI*pCmdUI){ if(m_pGraph==NULL) { pCmdUI->Enable(false); return; } pCmdUI->Enable(); pCmdUI->SetCheck(m_pGraph->IsStopped());}voidCDSPlayerDlg::OnHelpAbout(){ CAboutDlgdlg; dlg.DoModal();}voidCDSPlayerDlg::SetVolumeAndBalance(){ if(m_pGraph) { m_pGraph->SetAudioBalance(m_Bar.GetBalanceValue()); m_pGraph->SetAudioVolume(m_Bar.GetVolumeValue()); }}voidCDSPlayerDlg::DrawLogo(){ CRectrc; m_videowindow.GetClientRect(&rc); CDCmemDC; CClientDCClientDlgDC(m_videowindow.FromHandle(m_videowindow.m_hWnd)); CBrushbrush; brush.CreateSolidBrush(RGB(0,0,0)); ClientDlgDC.FillRect(&rc,&brush); CBitmapBitmap,*oldBitmap; BITMAPbmpInfo; intnWidth,nHeight; memDC.CreateCompatibleDC(&ClientDlgDC); Bitmap.LoadBitmap(IDB_LOGO); Bitmap.GetBitmap(&bmpInfo); nWidth=bmpInfo.bmWidth; nHeight=bmpInfo.bmHeight; oldBitmap=memDC.SelectObject(&Bitmap); ClientDlgDC.BitBlt((rc.right-nWidth)/2,(rc.bottom-nHeight)/2,nWidth,nHeight,&memDC,0,0,SRCCOPY); memDC.SelectObject(oldBitmap); }voidCDSPlayerDlg::ChangeVideoSize(intrate){ intCaptionHeight=GetSystemMetrics(SM_CYCAPTION); intMenuHeight=GetSystemMetrics(SM_CYMENU); m_videowindow.MoveWindow(0,0,m_pGraph->GetSourceWidth(),m_pGraph->GetSourceHeight()); intwidth; intheight; width=m_pGraph->GetSourceWidth()*rate/100; height=m_pGraph->GetSourceHeight()*rate/100+CaptionHeight+MenuHeight+m_Bar.GetHeight(); CRectrc; GetWindowRect(&rc); MoveWindow(rc.left,rc.top,width,height); CenterWindow();}
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 44988-2024过程工业安全仪表系统在线监视要求
- 工作转合同范例
- 父母购车赠与协议合同范例
- 厨房打扫工程合同范例
- 全国代理 合同范例
- 刷涂料工程合同范例
- 商城购物合同范例
- 牲猪购销合同范例
- 家用公寓出租合同范例
- 第12课《纪念白求恩》教学实录2024-2025学年统编版语文七年级上册
- 《压力平衡式旋塞阀》课件
- 信贷支持生猪养殖行业报告
- 学校食堂厨房规范化操作程序
- 物联网与人工智能技术融合发展年度报告
- 医保飞检工作方案
- 招投标基础知识讲解
- 沥青路面弯沉温度修正
- 穿戴甲创新创业项目计划书
- 软装公司商业计划书
- 湖北省武汉市硚口区2023-2024学年七年级上学期期末数学试题(含答案)
- 云南省昭通市巧家县2023-2024学年五年级上学期期末考试语文试卷
评论
0/150
提交评论