实验六媒体播放器实现.docx
- 文档编号:26358278
- 上传时间:2023-06-18
- 格式:DOCX
- 页数:25
- 大小:115.04KB
实验六媒体播放器实现.docx
《实验六媒体播放器实现.docx》由会员分享,可在线阅读,更多相关《实验六媒体播放器实现.docx(25页珍藏版)》请在冰豆网上搜索。
实验六媒体播放器实现
实验六媒体播放器实现
1.上机实验报告六
课程名称:
多媒体技术班级:
数媒**班实验日期:
2014.5.25-6.2
小组成员:
指导教师:
实验序号:
06实验成绩:
一、简单媒体播放器实现
二、实验目的及要求
目的:
使用VC++2005进行编程,基于控制台应用程序,使用DirectShowSDK实现流媒体播放器。
要求:
1、掌握使用DirectSound中常用接口完成音视频媒体回放、显示及控制等动作的方法;
2、利用接口中的控制函数完成控制操作;
3、学会面向对象的设计方法;
3、开发一个简单的基于控制台应用程序的媒体播放程序。
三、实验环境
本次上机实践所使用的平台和相关软件
VS2012MFC\win7
1
四、实验内容
1.平台搭建
DirectX是一个多媒体API,提供了与显卡、声卡、输入设备等进行交互的标准接口。
如果没有这个标准API,则将必须为每个显卡和声卡组合以及每种类型的键盘、鼠标和手柄编写不同的代码。
而DirectShow是微软为简化或降低音频/
视频开发的难度而为音视频应用开发人员定制的一套API函数。
是DirectX的一
个组件,提供对多媒体数据流的高质量捕获和回放。
不必关注视频硬件如显卡、
视频捕捉设备、视频编码算法、解码算法,音/视频数据同步等复杂细节。
此次在VS下媒体播放器的实现即需要DirectShow的有关静态库的配置和开发
环境的配置。
由于VS2012无需配置DirectX,用户可直接编译DirectShow里的baseclasses,选择成批编译,生成四个版本的静态库Debug、Debug_Unicode、Release、Release_Unicode。
为了能让VSc++自动搜索到SDK库和头文件,需对媒体播放工程进行环境配置。
(1)在include路径下添加DirectShow中的
、include、Common。
(2)在lib路基下添加DirectShow中的Debug
、Debug_Unicode、Release、Release_Unicode。
2.实现的基本功能:
打开/关闭媒体文件
播放/暂停/停止媒体
全屏显示
音量控制
抓图
静音控制
播放时总位于顶层
增加的功能:
屏幕缩放比例
退出
播放时长的显示
未来扩展功能:
希望实现前一个、下一个视频的播放
3.功能介绍:
1、点击“打开”,添加播放资源*.mpg;*.mpeg;*.avi;*.rmvb;*.rm;*.mp3;*.mid;*.wav;*.mov;*.qt;*.wmv;*.wma;*.asf
2、单击“播放”,开始播放或重新播放
3、点击“暂停”,暂停播放视频(只在视频播放时才可以生效);
4、单击“终止”,视频播放停止(只在视频播放时才可以生效);
5、滑动音量滑块调节音量大小(有左声道和右声道)
6、可以选择menu的各个功能,如抓图,缩放,全屏,退出,帮助里的关
于等。
2
五、调试过程及实验结果
实验效果图:
3
六、总结
通过这次实验,体会到了DirectShow的强大功能,为用户开发节省了很多时间。
例如DirectShow的视频窗口接口有专门的方法支持全屏显示功能,因此我们只需
boolCDXGraph:
:
SetFullScreen(BOOLinEnabled)
{
if(pVideoWindow)
{
HRESULThr=pVideoWindow->put_FullScreenMode(inEnabled?
OATRUE:
OAFALSE);
returnSUCCEEDED(hr);
}
returnfalse;
}
即可实现全屏显示的功能。
但是不足的是我未能使用GraphEdit管理滤波器的插入、连接和运行,
快速构建一个使用DitectShow的滤波器链表。
在链接滤波器引脚时,
无法链接。
主要原因是对GraphEdit不是很熟悉,时间来不及。
4
七、附录
核心代码:
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()
5
{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_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| 6 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); 7 } 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();} 8 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(); } 9 10
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 媒体播放器 实现