实验六媒体播放器实现.docx

上传人:b****9 文档编号:26358278 上传时间:2023-06-18 格式:DOCX 页数:25 大小:115.04KB
下载 相关 举报
实验六媒体播放器实现.docx_第1页
第1页 / 共25页
实验六媒体播放器实现.docx_第2页
第2页 / 共25页
实验六媒体播放器实现.docx_第3页
第3页 / 共25页
实验六媒体播放器实现.docx_第4页
第4页 / 共25页
实验六媒体播放器实现.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

实验六媒体播放器实现.docx

《实验六媒体播放器实现.docx》由会员分享,可在线阅读,更多相关《实验六媒体播放器实现.docx(25页珍藏版)》请在冰豆网上搜索。

实验六媒体播放器实现.docx

实验六媒体播放器实现

 

实验六媒体播放器实现

 

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模板 > 简洁抽象

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1