实验六媒体播放器实现.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