首页 > 范文大全 > 正文

基于DirectX的视频采集与处理系统

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于DirectX的视频采集与处理系统范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:视频采集与处理一直是人们关注的应用技术热点之一,被广泛应用于许多场合。针对流媒体处理的复杂性和技术性,分析了流媒体应用程序开发所面临的挑战,并深入剖析了DirectShow的应用架构。DirectX的多媒体处理系统――视频采集与处理是基于Microsoft Visual C++ 6.0开发环境以及Microsoft directx SDK 9.0b开发包开发的。基于DirectShow框架开发多媒体应用程序是非常的简单并且支持不同的视频采集设备,实现了多画面的视频采集,视频播放和视频图像处理等功能。

关键词:流媒体;视频采集;DirectShow;图像处理;视频播放

中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)32-1204-04

The Capture and Process System Based on DirectX

ZHANG Hong-bing,YU Yong-yan,ZHAO Huan,SONG Bing-guang,ZHOU Mei-fang

(Huaiyin Institute of Technology, Huai'an 223002, China)

Abstract: Video capturing and processing is always a applied technology which people pay a lot attention to, it is widely used By its convenience and abundant information. this article aim at complexity and technicality of video processing, analyze the difficulty of developing Application And deeply anatomy the DirectShow application architecture, The design and implement of application of video capture and process system platform based on DirectX is Based on the development of Microsoft Visual C++ 6.0 and the kit of Microsoft DirectX SDK 9.0.and analyze develop application based on DirectShow architecture is very simple things, and this system support the different hardware, realize the many windows capture, media playback and image process.

Key words: streaming media; video processing; directShow; image processing; media play

1 引言

DirectX软件开发包是微软公司提供的一套在Windows操作平台上开发高性能图形、声音、输入、输出和网络游戏的编程接口。而作为DirectX家族的核心成员之一的DirectShow,为在Windows平台上处得各种格式的媒体文件的回放、音视频采集等高性能要求的多媒体应用,提供了完整的解决方案。为了使应用程序开发人员从复杂的数据传输、硬件差异、同步性等复杂工作中解脱出来,利用DirectShow提供的应用框架和对底层设备的支持,开发了基于DirectShow框架的多媒体应用程序。

2 技术简介

2.1 系统架构

DirectShow系统中采用了过滤器图表管理器(Filter Graph Manager)的模型来管理整个数据流处理过程;参与数据处理的各个功能模块叫做过滤器 (Filter),各个过滤器在过滤器图表中按照一定的顺序连接成一条链路协同工作,使用过滤器图表管理器模型来管理整个数据流的处理过程。

如图1所示,图中最大的一块就是DirectShow系统,虚线以下是Ring 0特权级别的硬件设备,虚线以上是Ring 3 特权级别的应用层。DirectShow系统位于应用层中。DirectShow系统是基于组件对象模型(COM)标准的。

2.2 过滤器

过滤器(Filter)是DirectShow系统中的最基本的概念,是过滤器图表中最小的功能模块,DirectShow系统中将多媒体数据处理分离成不同的模块,在不同的模块中由不同的过滤器去处理,这样把相关的过滤器连接在一起,以达到处理多媒体数据的要求。按照功能来分,过滤器大致分为3类:源过滤器(Source Filters)、变换过滤器(transform Filters)和渲染过滤器(Rendering Filters)。源过滤器主要负责获取数据,源过滤器引入数据到过滤器图表中,数据来源可以是文件系统、网络、摄像头等。不同的源过滤器处理不同的类型的数据源。变换过滤器的工作是获取输入流,处理数据,并生成输出流。变换过滤器对序据的处理包括编解码、格式转换、压缩解压缩等。渲染过滤器在过滤器图表里处于最后一级,负责数据的最终的去向,将数据送给显卡、声卡进行多媒体的演示,或者输出到文件进行存储。

一个过滤器至少有一个输入端或者是输出端,在DirectShow系统中这些端口被称为引脚(pin),引脚是基于COM组件的,过滤器之间通过引脚相互连接,构成一条顺序的链路。应用程序是建立在DirectShow系统之上。首先应用程序要按照所要实现的功能建立起过滤器图表,然后借助于过滤器图表管理器来控制整个数据处理过程。DirectShow系统能在过滤器图运行接收到应用程序发送的各种消息事件,控制链路中的过滤器的运行状态,这就实现了应用程序与DirectShow系统之间的交互。在这过程中就要用到过滤器管理器组件。过滤器图表管理器也是一个COM对象,用来控制过滤器图表中的所有的过滤器,主要有以下几个功能:

1) 用来协调过滤器之间的状态改变,从而使过滤器图表中的所有的过滤器的状态的改变。

2) 建立一个参考时钟。

3) 将过滤器的消息返回给应用程序。

4) 提供方法用来建立过滤器图表。

2.3 对硬件的支持

DirectShow解决的方法是,为这些硬件设计包装过滤器;这种过滤器能够工作在用户模式下,外观、控制方法跟普通过滤器一样,而包装过滤器内部完成与硬件驱动程序的交互。DirectShow系统中已经集成了许多包装过滤器,这样的设计可以使开发人员从支持硬件的特殊处理中解脱出来。

3 基于DirectX的多媒体处理系统――视频采集与处理的实现

基于DirectX的多媒体处理系统――视频采集与处理是一个实用的应用软件系统,数据处理的整个流程就是:输入源―>中间件―>输出终端。完成视频的采集以及进一步进行相关的处理,本系统包括以下几个功能:视频采集功能、视频播放功能和视频图像的抓图及处理功能等。下面对系统各子功能模块进行分析。

视频采集功能:将摄像头捕捉到的模拟视频信号转换为数字视频信号并能实现预览功能,再通过相关的编码器进行编码,本系统采用了动态图像专家组编码器(MPEG-4 Codec, 简写为Xvid)编码器,将采集到的视频文件编码成动态图像专家组(Moving Pictures Experts Group, 简写为MPEG)格式的文件,减少了视频文件的大小,从而节省了硬盘的空间,同时也方便了在网络上传输。

视频播放功能:可对本地系统中的视频文件进行解码,并进行播放,其功能和其它的视频播放器的功能相似,如播放、暂停和全屏等。同时,本模块在理论上可以播放任何格式的媒体文件,只要系统中安装了相关的解码器即可。

视频图像的抓图及处理功能:可对本地系统中的图像文件进行显示,并能对图像进行处理,除了实现一些经典的图像处理算法,并能实现一些新颖的图像处理算法。

下面根据本课题的任务,确定组成该系统的每个功能模块的结构,然后进行该系统的结构设计,从而确定模块组成以及这些模块之间的动态调用关系。整个基于DirectX 的多媒体处理系统――视频采集与处理的设计的过程,都遵循系统模块之间独立的原理,也就是说该系统由一组完全相对独立的子功能模块组成,而且这些模块彼此之间的接口关系尽量简单。

3.1 视频采集的实现

在编程实现过程中,要把视频采集设备封装成类,用面向对象的思想来进行视频采集模块的详细设计。在视频实时采集的功能就是在程序界面上能显示多个画面,能对多个视频采集设备进行操作,对每个视频采集设备的工作都是独立的,该系统是采用多线程的,这也是现代软件也是必须的,换句话说每个视频采集设备都使用一个线程,一个视频采集设备的损坏或不正常工作,对其它的视频采集设备均不造成影响,保证了程序的实用性和健壮性,对每个图像显示画面,可以选择视频采集设备,要求系统能枚举出系统中的安装的所有视频采集设备,可对视频采集的画图的大小进行调节,通过程序能调用视频采集设备的属性页,进而能对视频采集设备进行更高一级的调整。这样能保证了视频采集设备所采集到的图像画面达到一个最佳的效果。

通常情况下视频采集设备所采集到的模拟图像,系统在一般情况下,采集到的视频为音频视频交错格式(Audio Video Interleaved, 简写为AVI)的,众所周知,AVI格式是非压缩的、视频数据量非常巨大,对要求将视频文件保存到本地系统中或传输给其它网络用户来说,这是不可能接收的,数据压缩的问题由来已久了,在计算机刚刚发展的时候,在有限的带宽的条件下,怎样才能传输数据量大的文件时,大量的计算机专家就开始了数据压缩方面的研究,到现在为此,有关数据压缩方面的算法已经相当的成熟了,在视频处理方面则出现了许多的编码器,其实在开发过程中可以自己写一个视频相关的编码器,但因为有相关的组织开发了许多相关的视频编解码器,且相关的视频编解码器的开源的,为了减轻开发的难度,同时又能达到差不多的效果,所以在本系统开发中采用第三方的编码器,对视频数据进行编码,程序界面中可选择相关的编码器。还有一个功能就是在视频实时采集时能对视频图像进行抓图,将抓到的图像进行保存到本地文件系统中,保存的格式为常见的位图图像(Bit Map Picture, 简写为BMP)格式。视频采集设备必须以Filter的形式才能参与到DirectShow系统中,进而与其他Filter协同工作。采集设备的创建是实质上就是系统的枚举过程,程序先是枚举到系统中所有的视频采集设备的友好名字,当用户选定一个视频采集设备后,就可以得到这个设备的友好名字或者显示名字,然后就可以以这个名字为参数去创建它。具体的过滤器的连接过程,可借用微软公司提供的GraphEdit,该工具提供了可视化的环境,大大降低了开发有关的程序的难度。

3.2 视频播放的实现

该模块实现了和其它相关的视频播放器相关的功能,能对视频进行打开和播放,能进行一些相关的基本操作,同时考虑到主要是对视频采集设备采集到的视频文件进行回放和处理,添加了一些与本系统相关的功能,如图像的叠加、局部放大、嵌入字幕等,该播放器理论上能播放任何类型的文件(只要系统中注册相关的解码过滤器),在播放媒体文件过程中,可以通过播放界面的上按钮或“控制”菜单下的子菜单项进行各种播放控制,包括:播放、暂停、停止、实现静音播放、音量大小调节、声道平衡设置、快放、慢放、全屏播放、截图等功能。对视频播放器的界面进行设计时,可考虑到界面的美观、操作易用、功能完善等方面,进行该模块设计的主要目的是添加一些与该系统相关的操作,考虑用户的需求,尽量的实用化,做出自己的特色来,要让用户用到该播放器模块时,要认可该播放器,因为用户已经用过许多的多媒体播放器,已经习惯于自己常用的播放器的操作,制作该模块主要在于界面的美化方面。

3.3 视频图像处理的实现

该模块包含以下几个功能:视频图像的载入、视频图像的播放和视频图像处理算法的实现。

近几年来,由于计算机技术的迅猛的发展,从而使得图像处理得以广泛应用于众多的科学与工程领域,这些技术正在明显地改变着人们的生产手段和生活方式。正因为图像处理有如此多的应用,如此与人们的生活方式息息相关,所以有必要对图像和图像技术进行深入细致的研究。该模块的程序界面和一般的图像处理软件差不多,有一些最基本的图像处理操作,例如:图像的增强,图像的复原,图像的变换等。还要实现一些高级的图像处理算法,如:图像的配准,图像的分析和特性的提取,目标和运动检测,图像分割和图像的识别等。其中的算法已经实现的,参考其它的代码来实现,对一些未实现的算法或算法表现的效果不满意的,争取写出自己的程序算法,并来检验自己的算法效果。

4 基于DirectX的多媒体处理系统――视频采集与处理的代码实现与分析

4.1 硬件部分

图像采集设备一般采用CCD摄像机加上WDM图像采集卡或者是USB 2.0摄像头具有稳定、支持热插拔、采集的图像分辨率大、性价比高等优点,而USB 2.0带宽最大可达到480MB/s,最大支持连接的外设理论上为127个,适合较大数据量的传输。基于以上的优点,本系统采用了基于USB 2.0的摄像头。

4.2 软件的关键实现部分

该系统的数据采集部分实现的思想如图2所示,用USB 摄像头采集视频数据,利用DirectShow提供的对视频采集硬件的包装过滤器,在过滤器内完成视频数据采集功能。

过滤器图表中加入源过滤器是通过系统枚举的方式来实现的,在DirectShow的GraphEdit下目录Video Capture Sources(对应的过滤器ID为:CLSID_VideoInputDevicesCategory)下找到相应的采集设备。

ICreateDevEnum * enumHardware = NULL;

HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_ALL,

IID_ICreateDevEnum, (void**)&enumHardware);

//创建系统枚举组件

hr = enumHardware->CreateClassEnumerator(inCategory, &enumMoniker, 0);//为指定目录创建枚举器,并获得IEnumMoniker接口

while (!hardwareFilter && SUCCEEDED(enumMoniker-

>Next(1, &moniker, &fetched)) && fetched)

//循环枚举采集设备

moniker->BindToObject(0, 0,

IID_IBaseFilter, (void**)&hardwareFilter);

//创建过滤器实例

枚举到采集设备后,下一步的工作就是把它加入到过滤器图表中,代码如下:

mGraph->AddFilter(mFilter, mName)

为了对视频数据压缩和写入文件,代码如下:

mAviMux = new CAviMuxFilter(mGraph->GetGraph());

//创建编码、合成、写文件需要的过滤器

pass = mAviMux->CreateFilter();

mFileWriter = new CFileWriterFilter(mGraph->GetGraph());

pass = mFileWriter->CreateFilter();

//创建文件写入过滤器

mFileWriter->SetDestFile(mLiveCapture->GetOutputFile());

//给文件写入过滤器设置文件路径

if (mLiveCapture->GetEncodingType() == ET_Xvid)

//如有必要创建编码过滤器

{IBaseFilter* pFlt = UDsUtils::CreateCompressor(TRUE,

"Xvid MPEG-4 Codec");//v1.13

//通过枚举Video Cpmpressors目录来创建DivX压缩过滤器

if (pFlt)

{

mVideoEncoder = new CDXFilter(mGraph->GetGraph());

mVideoEncoder->Attach(pFlt, "Xvid MPEG-4 Codec");

//如果成功,将压缩过滤器加入到过滤器图表中

}

在本系统中,能显示出视频采集设备的属性页,并能对视频采集设备的属性页进行设置。核心代码为:

ISpecifyPropertyPages * pSpecify;

HRESULT hr = inFilter->QueryInterface(IID_ISpecifyPropertyPages,

(void **)&pSpecify);

//从Filter上获得ISpecifyPropertyPages接口

if (SUCCEEDED(hr))

CAUUID caGUID;

pSpecify->GetPages(&caGUID);

pSpecify->Release();

OleCreatePropertyFrame(::GetActiveWindow(),0,0,NULL,1,

(IUnknown **) &inFilter, caGUID.cElems,caGUID.pElems, 0, 0, NULL );

//显示采集设备的属性页

CoTaskMemFree(caGUID.pElems);

//释放资源

本系统还实现了视频播放功能,在本功能实现过程,采用了DirectShow系统中所特有的技术,这种“自动”机制也称为智能连接,在代码中调用了IGraphBuilder::RenderFile函数,该函数能自动加入必要的过滤器来完成视频文件的回放过滤器图表的构建,并设置显示窗口和消息窗口。核心代码如下:

mFilterGraph->RenderFile(mSourceFile);

//处理mSourceFile并准备播放;建立一个过滤器链路

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

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

//设置显示窗口和消息窗口

本系统实现了基于对话框的视频图像显示,并能对视频图像进行处理并显示出来,其核心代码如下:

CClientDC ClientDC(pDCShow->GetWindow());

//得到显示区域

m_pResMap=new CBitmap();

//新建一个CBitmap对象

m_pResMap->CreateCompatibleBitmap(&ClientDC,m_nWndWidth,m_nWndHeight);

//初始化CBitmap对象

dc.CreateCompatibleDC(&ClientDC);

//创建DC句柄

for(int i=0; i<m_nWndHeight; i++)

for(int j=0; j<m_nWndWidth; j++)

dc.SetPixelV(j,i,RGB(m_tResPixelArray[i][j].rgbRed,

m_tResPixelArray[i][j].rgbGreen,m_tResPixelArray[i][j].rgbBlue));

//对每个像素进行赋值

pDCShow->StretchBlt(0,0,m_nWndWidth,m_nWndHeight,&dc,0,0,

m_nWndWidth,m_nWndHeight,SRCCOPY);

//画图语句

5 结束语

在Windows平台下,DirectShow是开发视频采集与处理的应用程序的有效方法,本文介绍开发一种较为实用,采用基于USB摄像头的采集设备的视频采集方法,采用了DirectShow系统中所特有的智能连接的机制来加入必要的过滤器完成对视频文件的回放过滤器图表的构建和对视频图像进行处理。在实际运行中稳定可靠,视频图像清晰,可以适用于多个场合并可对其进行二次开发,以满足特殊的需要。

参考文献:

[1] 吴志军,马兰,沈笑云.Visual C++视频会议开发技术与实例[M].北京:人民邮电出版社,2006

[2] 高守传,聂云铭,郑静.Visual C++6.0开发指南[M].北京:人民邮电出版社,2007.

[3] 戴博,周杨,龚涛,等.Visual C++程序员成长攻略[M].北京:人民水利水电出版社,2007.

[4] 杨枝灵,王开.Visual C++数字图像获取处理及实践应用[M].北京:人民邮电出版社,2003.

[5] 四维科技,刘t玮.Visual C++视频/音频开发实用工程案例精选[M].北京:人民邮电出版社,2004.

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

[7] 陆其明.DirectShow实务精选[M].北京:科学出版社,2004.

[8] 张益贞,刘滔.Visual C++实现MPEG/JPEG编解码技术[M].北京:人民邮电出版社,2002.

[9] 求是科技.Windows API 程序设计参考大全[M].北京:人民邮电出版社,2006.

[10] 电脑编程技巧与维护. Visual C/C++图形图像与游戏编程典型实例解析[M].北京:中国水利水电出版社,2006.

[11] 宋辉,曲向丽,宋振龙.Visual C++实用培训教程[M].北京:人民邮电出版社,2002.

[12] Microsoft Corporation.Microsoft DirectX 9.0 SDK Document.Microsoft Corporation,2002.

[13] Microsoft Corporation.MSDN Library Visual Studio 6.0[M].Microsoft Corporation,2001.

[14] Michael Blome,Mike Wasson.Core Media Technology in Windows XP Empowers You to Create Custom Audio/Video Processing Components[M].MSDN Magazine,2002.

[15] DON BOX. .COM本质论[M].潘爱民,译.北京:中国电力出版社,2001.