实验六 媒体播放器实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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()