实验六 媒体播放器实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六媒体播放器实现

1. 上机实验报告六

课程名称:多媒体技术班级:数媒**班实验日期:2014.5.25-6.2 小组成员:指导教师:

实验序号:06 实验成绩:

一、简单媒体播放器实现

二、实验目的及要求

目的:使用VC++2005进行编程,基于控制台应用程序,使用DirectShow SDK 实现流媒体播放器。

要求:

1、掌握使用DirectSound 中常用接口完成音视频媒体回放、显示及控制等动作的方法;

2、利用接口中的控制函数完成控制操作;

3、学会面向对象的设计方法;

3、开发一个简单的基于控制台应用程序的媒体播放程序。

三、实验环境

本次上机实践所使用的平台和相关软件

VS2012MFC\win7

四、实验内容

1.平台搭建

DirectX是一个多媒体API,提供了与显卡、声卡、输入设备等进行交互的标准接口。如果没有这个标准API,则将必须为每个显卡和声卡组合以及每种类型的键盘、鼠标和手柄编写不同的代码。而DirectShow是微软为简化或降低音频/视频开发的难度而为音视频应用开发人员定制的一套API函数。是DirectX的一个组件,提供对多媒体数据流的高质量捕获和回放。不必关注视频硬件如显卡、视频捕捉设备、视频编码算法、解码算法,音/视频数据同步等复杂细节。

此次在VS下媒体播放器的实现即需要DirectShow的有关静态库的配置和开发环境的配置。由于VS2012无需配置DirectX,用户可直接编译DirectShow里的baseclasses,选择成批编译,生成四个版本的静态库Debug、Debug_Unicode、Release、Release_Unicode。为了能让VS c++自动搜索到SDK库和头文件,需对媒体播放工程进行环境配置。(1)在include路径下添加DirectShow中的BaseClasses\、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的各个功能,如抓图,缩放,全屏,退出,帮助里的关于等。

五、调试过程及实验结果实验效果图:

六、总结

通过这次实验,体会到了DirectShow的强大功能,为用户开发节省了很多时间。例如DirectShow的视频窗口接口有专门的方法支持全屏显示功能,因此我们只需

bool CDXGraph::SetFullScreen(BOOL inEnabled)

{

if (pVideoWindow)

{

HRESULT hr = pVideoWindow->put_FullScreenMode(inEnabled ? OATRUE : OAFALSE);

return SUCCEEDED(hr);

}

return false;

}

即可实现全屏显示的功能。

但是不足的是我未能使用GraphEdit管理滤波器的插入、连接和运行,快速构建一个使用DitectShow的滤波器链表。在链接滤波器引脚时,无法链接。主要原因是对GraphEdit不是很熟悉,时间来不及。

七、附录

核心代码:

void CDSPlayerDlg::OnFileOpenQuick()

{

CString strFilter;

strFilter = "媒体文件(所有类型)|*.mpg;*.mpeg;*.avi;*.rmvb;*.rm;*.mp3;*.mid;*.wav;*.mov;*.qt;*.wmv;*.wma;*.asf|";

strFilter += "All Files(*.*)|*.*|";

CFileDialog dlgOpen(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, strFilter, this);

if (IDOK == dlgOpen.DoModal())

{

PlayFile(dlgOpen.m_ofn.lpstrFile);

}

}

void CDSPlayerDlg::OnSize(UINT nType, int cx, int cy)

{ CDialog::OnSize(nType, cx, cy);

CRect rc;

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)

{ CRect rc;

GetClientRect(&rc);

rc.bottom -= m_Bar.GetHeight();

m_videowindow.MoveWindow(&rc);

m_pGraph->SetWindowPos(&rc);

}

DrawLogo();

}

void CDSPlayerDlg::OnFileClose()

{ DestroyGraph();

m_Bar.EnableToolButton(false);

m_Bar.EnableSlider(false);

SetTimer(TIMER_DRAWLOGO, 10, NULL);

m_Bar.DrawStatusBar();

SetWindowText("Media Player Classic");

}

void CDSPlayerDlg::OnFileShot()

相关文档
最新文档