首页 > 范文大全 > 正文

基于directshow的视频播放器设计与实现

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于directshow的视频播放器设计与实现范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

【摘 要】设计并实现了一款基于directshow视频播放器,在资源占用上较占优势。给出了Directshow利用Filter和Filter Graph播放视频的步骤。之后给出了媒体播放器的基本模块,最后给出了播放器几个功能的具体实现并对比同类软件进行了性能测试。

【关键词】Directshow;Filter;FilterGraph

0 引言

随着信息技术的发展,多媒体播放器迎来新的挑战。在多媒体应用技术中,对多媒体大量的数据传输、高效的数据处理、音视频流的同步、媒体流的格式转换,一直是需要解决的主要问题,怎样使流媒体的处理变得简单而富有成效逐渐成为了焦点问题。而选择一种合适的应用方案,将事半功倍。

本文以微软的Visual C++作为开发工具,以Directshow为框架设计一个能播放RMVB,MP4,AVI等常见格式的播放器。

1 DirectShow概述

在DirectShow中,一个应用程序必须实例化一个或者多个过滤器,并将它们连接起来.所有这些过滤器和它们之间的连接被称为过滤器图表(FilterGraph)。应用程序通过过滤器图表管理器(Filter Graph Manager)来创建相应的Filter Graph.其中,Filter Graph Manager也是个COM组件,它为应用程序提供了建立Filter Graph的各种方法,控制着FilterGraph的运行。

2 Filter和Filter Graph

DirectShow是基于模块化,每个功能模块都采取COM组件方式,称为过滤器(Filter)。Directshow提供了一部分标准的过滤器可直接使用,开发者也可开发自己的功能Filter来扩展Directshow的应用。下面用一个简单的小例子来说明如何使用Filter来播放一个格式为AVI的视频文件。

(1)先从文件中读取AVI数据,形成字节流(由源Filter完成这一步骤)。

(2)检查AVI数据流的头格式,然后通过AVI分割Filter将视频流和音频流分离。

(3)根据数据压缩格式的不同,选取不同的decoder Filter对视频进行解码。

(4)使用Renderer Filter重画视频图像。

(5)音频流送到声卡进行播放,一般采用缺省的DirectSound DeviceFilter。

图1 播放AVI 文件的过滤器图管理器

图1中的箭头表示Filter链表中的数据流的方向。在DirectShow中,像上面的这样一个Filter 链表我们称为Filter Graph。

Filter 一般分为下面几种类型。

(1)源过滤器(Source Filter):源过滤器引入数据到过滤器图中,数据来源可以是文件、网络、照相机等。不同的源过滤器处理不同类型的数据源。

(2)变换过滤器(Transform Filter):变换过滤器的工作是获取输入流,处理数据,并生成输出流。变换过滤器对数据的处理包括编解码、格式转换、压缩解压缩等。

(3)提交过滤器(Renderer Filter):提交过滤器在过滤器图里处于最后一级,它们接收数据并把数据提交给外设。

Filter有三种状态:运行、暂停、停止,Filter Graph中所有的Filter的状态的改变都是统一的,所以Filter Graph也有运行,停止,暂停三种状态。

3 播放器的主要功能

(1)播放器基本功能:播放、暂停、停止;

(2)实现解码回放有关的功能:如拖动进度条,调节播放进度;

(3)截图功能:抓取图片并保存为一个本地的位图;

(4)声音、声道控制:调节音量、调整音道功能。

按照播放器的功能,将播放器模块进行划分,得到系统的功能结构图如下:

4 具体功能实现

媒体播放器的定位接口的获取、全屏实现、音量控制和静音设置关键代码实例。

4.1 定位

首先获取Filter Graph的各个控制接口,查询接口函数的代码如下:

//得到播放器控制接口、定位接口等

bool CDXGraph::QueryInterfaces(void)

{

if (mGraph)

{

HRESULT hr = NOERROR;

//得到播放控制接口

hr|=mGraph->QueryInterface(IID_IMediaControl,(void**)&mMediaControl);

//得到媒体事件接口

hr |= mGraph->QueryInterface(IID_IMediaEventEx,(void **)&mEvent);

//得到视频窗口接口

hr|=mGraph->QueryInterface(IID_IVideoWindow,(void**)&mVideoWindow);

//得到音频相关接口

hr |= mGraph->QueryInterface(IID_IBasicVideo, (void **)&mBasicVideo);

//得到音频相关接口

hr |= mGraph->QueryInterface(IID_IBasicAudio, (void **)&mBasicAudio);

{

mSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);

}

return SUCCEEDED(hr);

}

return false;

}

//设置视频窗口并设置消息通知窗口

mFilterGraph->SetDisplayWindow(mVideoWindow.GetSafeHwnd());

mFilterGraph->SetNotifyWindow(this->GetSafeHwnd());

4.2 声音调节/静音设置

获取声音控制接口指针mBasicAudio,声音大小控制函数:

bool CDXGraph::SetAudioVolume(long inVolume)

{

if (mBasicAudio)

{

HRESULT hr = mBasicAudio->put_Volume(inVolume);

return SUCCEEDED(hr);

}

return false;

}

进行静音设置:

void CSimplePlayerDlg::OnMute()

{

m_bMute=!m_bMute;

//当播放链路存在时,设置是否静音

if (mFilterGraph) {

if (m_bMute)

mFilterGraph->SetAudioVolume(VOLUME_MUTE);

else

mFilterGraph->SetAudioVolume(VOLUME_NORMAL);

}

//播放链路尚未建立时,设置是否静音 (isInitedSilence在播放按钮响应函数中使用,指示初次播放是否静音)

else

{

if (m_bMute)

{

isInitedSilence=0;

}

else

{

isInitedSilence=1;

}

}

4.3 全屏实现

通过QueryInterfaces 函数获取IVideoWindow 视频窗口控制接口,根据传入的布尔值,设置为全屏播放文件(在全屏模式下,按ESC将恢复到正常模式)。

bool CDXGraph::SetFullScreen(BOOL inEnabled)

{

if (mVideoWindow)

{

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

return SUCCEEDED(hr);

}

return false;

}

5 性能测试

选取了两款开源视频播放器Mplayer,VLC Media Player还有Windows系统自带的Media Player进行测试,测试视频为BBC记录片《美丽中国》的发行版,分辨率为1024*576,该纪录片是第一部表现中国野生动植物和自然人文景观的大型电视纪录片,从一个前所未有的角度,向电视观众展示中国的魅力。

测试平台主要配置:

本播放器基于2002年Microsoft的Directshow SDK 9.0进行开发,而测试中使用的2015年编译的Mplayer和VLC Media Player版本虽然对Intel酷睿2架构有更好的支持,更好的利用了最新的SSE4等指令集,OpenGL的功能也很强大,但因为Directshow在windows平台上的优势,在性能上依然与本设计存在一定差距。而本播放器因为功能较为精简的原因,在性能上对同出自于Directshow的Windows Media Player仍有一定优势。

6 结语

DirectShow提供的良好开发环境,使得媒体播放器开发实现比较方便。本系统采用的是智能连接,只要是曾在系统注册过的Filter均可以使用,避免了重复编写Filter的麻烦,造成代码的冗余。虽然在性能上相对于同类软件有一定优势,然而并没有网络功能,这也是今后要探索的方向。

【参考文献】

[1]庞然.基于DirectX的音视频播放器软件设计[D].浙江:浙江大学,2006.

[2]赵炯.利用VC_实现基于DirectShow的视频播放器开发[J].成都大学学报,2011.

[3]路锦正,周冬梅.VisualC++音频/视频处理技术及工程实践[M].北京:电子工业出版社,2009.

[4]陆其明.DirectShow开发指南[M].北京:清华大学出版社:2003.

[5]张玲玲.VisualC++音频/视频技术开发与实战[M].北京:清华大学出版社,2012.

[6]蒿淑勤.音视频播放器的开发大连[D].大连理工大, 2010.