版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验六媒体播放器实现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(&b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大班柳树姑娘听评课记录
- 2018听课评课记录
- 2013年造价课程设计
- 泉州市金门县2024年一级造价工程师《土建计量》预测试卷含解析
- 《助产士的沟通技巧》课件
- 《豪威MT平台操作》课件
- 《数据通信网》课件
- 理学成果答辩报告模板
- 和田专业水池防腐施工方案
- 吉林锅炉烟囱维修施工方案
- GB/T 22924-2024复合肥料中缩二脲含量的测定
- 教育系统突发公共安全事件应急预案
- 2024年1月辽宁省普通高中学业水平合格性考试物理试题(含答案解析)
- 2024海康威视综合安防平台(服务器)DS-VE22S-B系列安装指南
- 第九周 任意角和弧度制和三角函数的概念-高一数学人教A版(2019)必修第一册周周测
- 期末测试卷(试题)-2024-2025学年四年级上册数学沪教版
- 压疮的预防及护理课件(完整版)
- 职工宿舍资产管理制度
- 污水处理运营维护方案
- 5G网络性能测试方法
- 古诗词诵读《临安春雨初霁》课件 统编版高中语文选择性必修下册
评论
0/150
提交评论