开篇:润墨网以专业的文秘视角,为您筛选了一篇DirectShow视频采集系统范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
[摘要] 目前,多媒体技术飞速发展,各行业对多媒体技术的应用也越来越广泛,传统的视频采集技术存在着一定的局限性,不能很好的应用于当前的视频系统。本文提出了一种基于directshow的视频采集系统,克服现状。本文采用的一种基于DirectShow的视频采集系统支持多种格式的视频文件的捕捉和回放,也支持使用Windows驱动模型(WDM)设备或过去的VFW设备。在开发过程中是基于组件对象模型(COM),通过编写COM客户程序来实现视频的采集回放等功能。在具体实现过程中通过编写Filter来实现各功能模块,最后把各功能模块通过Filter Graph组建起来。
[关键词] DirectShow 视频采集 COM
一、引言
随着多媒体技术的不断发展,与之相关的软件与硬件层出不穷,现在与多媒体视频会议(Video Conference)、视频对话相关的软硬件正成为人们关注的热点应用。而在这些应用中无不涉及视频数据的采集。
传统的视频采集技术存在诸多的局限性,无法很好地应用于当前的各类视频系统。针对这一现状,本文提出了一种先进的基于DirectShow的视频采集系统。该系统充分利用DirectShow与WDM视频采集卡的良好集成特性,采用组件对象模型的系统架构,克服了传统视频采集技术的不足,在实际应用中取得了满意的效果。
二、DirectShow技术
微软DirectShow是微软windows平台上的流式媒体体系结构。DirectShow提供媒体流的高质量的捕捉与回放。它支持多种格式,包括高级流格式,活动图片专家组格式,音频-视频交叉格式,第三层mpeg格式(mp3)和wav文件格式。他也支持使用windows驱动模型设备或老的windows视频设备的捕捉。DirectShow与其他DirectX技术集成于一体,自动感觉和使用视频和音频硬件加速,同时也支持没有硬件加速的系统。
DirectShow简化了媒体回放,格式转换和捕捉任务。它是基于控件对象模型(com)的。要写DirectShow应用,就必须理解com客户编程。就绝大多数应用而言,不必实现com对象。DirectShow提供了你需要的控件。(如果要通过写自己的控件来扩展DirectShow的功能,必须把他们作为com对象来实现。)
技术
在DirectShow技术当中,一般也把COM组件叫做Filter,它一般分成三类:源过滤器(Source filter)、转换过滤器(Transform filter)、提交过滤器(Rendering filter),用来处理流媒体数据。Filter带有输入、输出针角(pin),或二者兼而有之。Filter通过向文件读写、修改数据和显示数据到输出设备上来操作流媒体。为了完成整个任务,必须要将所有的Filter连接起来,这三种Filter组成了过滤器图表管理器(Filter graph manager)。
源过滤器、转换过滤器、提交过滤器分别完成数据提供、数据格式转换(压缩编码等)和数据渲染和回放功能。所以,为了实现在WIN32系统下的视频采集,我们首先要构造出一个适当的过滤器图表,然后通过应用程序对过滤器图表的管理来完成视频采集的功能。
2.DirectShow技术
在一般的软件开发工具中(比如VB,VC)都可以直接调用windows系统下的MCI控制接口)函数或者媒体播放控件(WMP等),设定相关的文件名等属性就可以实现视频的捕捉或回放。随着多媒体技术的迅速发展,各种压缩算法在该领域的应用,MCI技术越来越显的力不从心,最明显的是它不支持可变比特率的压缩算法,对于处理DVD等近年出现的多种新的媒体格式已显得无能为力。随后,微软又适时推出了建立在DirectX之上的DirectShow技术,它也是一种API(应用程序接口),每个DirectX部件都是用户可调用的API的总和,通过它应用程序可以直接访问计算机的硬件。支持来自本地或网络的各种视频、音频压缩格式的媒体文件的解码和回放,可以从设备上捕捉多媒体流,也可以处理各种压缩算法处理的流媒体。这些格式包括:MPEG的音频和视频标准、音频和视频交互标准(AVI)、WAVE、MIDI和高级流格式ASF。
DirectShow的基本原理是多媒体数据在过滤器图表中流动,通过过滤器图表中各过滤器(Filter)实现在功能,最终实现多媒体数据在提交过滤器中的显示和回放。
(1)国内研究状况。目前,国内研究此类项目已经相对成熟,主要用C++编程工具对其进行开发。一般用Filter来完成各种功能。Filter是一种进程内的COM组件。DirectShow SDK提供了一套基类源代码,这些源代码可以大大降低开发Filter的难度。
DirectShow位于应用层中,它使用Filter Graph的模型来管理整个数据流的处理过程;参与数据处理的各个功能模块是Filter;各个Filter 在Filter Graph中按一定的顺序连接成一条“流水线”协同工作。源过滤器主要负责取得数据,数据源可以是文件、因特网、或者计算机里的采集卡、数字摄像机等,然后将数据往下传输;转换过滤器主要负责数据的格式转换、传输;提交过滤器主要负责数据的最终去向,最终可以将数据送给声卡、显卡进行多媒体的演示,也可以输出到文件进行存储。
(2)国外研究状况。与国内相同,许多国外的软件设计师也是利用Filter来实现各种功能。DirectShow最初是为C++应用程序设计的(也可以使用C语言)使用微软的Visual Basic语言,可以访问DirectShow API的一个很大的子集,但对VB的支持并不完全,如使用微软的JScript,DirectShow也支持基于script的DVD应用程序。使用Borland Delphi书写DirectShow应用程序也是可能的,但是,微软的软件开发包(SDK)文档没有关于该部分的参考资料。
三、基于DirectShow的视频采集系统
基于DirectShow的视频采集系统主要设计目的是简化建立基于Windows平台的数字媒体应用程序的设计任务。并使它无需涉及数据传输,硬件通用性,媒体同步等等诸多复杂问题。为了完成所需的音视频流的处理,DirectShow应用了DirectDraw和DirectSound技术。这些技术可以有效率将数据图像和音频还原(render)到用户的显卡和声卡上去。DirectShow通过压缩媒体流上的时间标记(time-stamped)来实现媒体同步重放。为了能够处理不同可能出现的数据源、数据格式以及硬件系统,DirectShow采用了一种标准化结构体系。
在DirectShow标准结构体系中,DirectShow过滤器与控制、多样化的设备、本地文件系统、TV调频和视频捕获卡、VFW编码器、视频显示卡(通过DirectDraw)和显卡进行交互。DirectShow也为几种文件格式提供本地压缩和解压过滤器。
1.系统构架
对本视频采集系统,可以简单的把系统流程概括成如下两点:USB摄像头:视频捕获视频处理转换视频存储;本地视频:视频文件打开显示视频压缩转换等处理视频存储
2.系统实现
开发DirectShow应用程序,一般有三个阶段:第一阶段,创建一个Filter Graph Manager组件;第二阶段,根据实际的应用,创建一条完整的Filter链路。比如播放一个本地文件(在这个阶段,构建Filter链路之前,为了证明构思中的Filter链路是切实可行的,首先要在GraphEdit中验证,然后再以GraphEdit中的Filter链路为模型在程序中实现);第三阶段,调用Filter Graph Manager上(或者直接在某个Filter上)的各个接口方法进行控制,并且完成Filter Graph Manager与应用程序的事件交互。
(1)具体应用设计。前面讲到了源过滤器、转换过滤器、提交过滤器的简单功能,它们分别完成数据提供、数据格式转换(压缩编码等)和数据渲染和回放功能。所以,为了实现在WIN32系统下的视频采集,我们首先要构造出一个适当的过滤器图表,然后通过应用程序对过滤器图表的管理来完成视频采集的功能。
这里我们一般需要2个~3个过滤器,这几个过滤器分别是:
a.Video Capture Filter 采集设备Filter
b.Smart Tee Filter 将没有Preview引脚Filter的Capture引脚分为两支数据流(可选)
c.Video Venderer 视频渲染及回放Filter
通过上面3个过滤器,我们可以构造出一个完整的视频采集过滤器图表(如图)
图表构造出来后,接下来就剩下具体的实现了,我们只需依次构造每个Filter,然后将各信Filter的Pin按序相连即可完成图表的构造。最后,我们通过应用程序向图表发送命令(通过图表管理器完成)来控制整个视频采集流程。
(2)视频捕捉。如何从视频设备进行视频捕捉?在所设计的系统中,有个功能就是从USB摄像头中捕获视频,换句话说就是从视频设备中进行视频捕捉。基于DirectShow的视频采集系统中就要充分利用DirectShow本身的功能进行设计。
在DirectShow的filter中,有一类Capture Filter,它一般代表的是捕捉卡等硬件设备,其实它就是DirectShow与设备的Driver之间的接口。因为Filter通过DeviceIoctl函数实现交互,使得应用程序员可以通过DirectShow的Filter直接与捕捉设备的Driver进行通信。
我们只需将Capture Filter加入Filter Graph中,在通过其提供的接口函数就可以捕捉我们需要的视频或音频数据。
另外,如何在媒体播放过程中捕捉视频?Sample Grabber Filter是Transform filter的一种,它提供了一些接口能够检索(retrieve)在Filter Graph中传递的数据样本(samples),从而实现对播放过程中数据流的控制。比如通过IsampleGrabber::GetCurrentBuffer就可以得到当前的图像帧,进而将其保存为文件或者显示在指定的地方。在陆其明老师编写的《DirectShow开发指南》一书中,也有详细介绍图片的抓取,有种简单的方法就是使用IBasicVideo::GetCurrentImage接口的方法。
3.实验结果及分析
本系统采用COM编程技术,利用VC++编程语言,实现了视频采集储存等功能,在实际运用中简单方便。它能进行视频的采集存储等一些功能,同时也支持AVI,MPEG等格式的视频的播放,大致分成几个功能块:
(1)本地视频播放:可以选择本地AVI和MPEG格式的视频进行播放,并对其某一桢画面进行捕获与存储。
(2)USB摄像头捕获视频:通过USB摄像头,进行视频的采集,并可以自定义对所捕获到的视频进行保存。
(3)图像存储:可以对所捕获或播放的视频中的某一桢画面进行存储。
(4)渲染功能:通过Filter对视频进行色调的处理渲染。
当然,本系统还存在一定的问题,需要进一步的改进,在今后会做更深的研究,弥补现在的不足之处。
四、结束语
多媒体技术已经越来越被人们所重视,在传统的视频采集技术存在的局限性也越来越明显,无法很好地应用于当前的各类视频系统,因此先进的视频系统必定会取而代之。
本文所提出的一种基于DirectShow的视频采集系统,充分利用DirectShow与WDM视频采集卡的良好集成特性,采用组件对象模型的系统架构,克服了传统视频采集技术的不足,在以后的应用当中必将取得重要地位。
参考文献:
[1]陈淑珍陈窖:基于COM技术的多媒体监控系统的设计与实现[J].武汉大学学报,2001.47(3):377~380
[2]陆其明:DirectShow实务精选[M].北京科海电子出版社,2004.7
[3]陆其明:DirectShow开发指南[M].清华大学出版社,2003
[4]魏立诚朱桂林:基于DirectShow的视频采集系统的设计与实现[J].计算机工程,2005.7
[5]文坤高胜法:DirectShow程序设计原理及应用[J].计算机系统应用,2006.3
[6]武兆雪夏靖波:基于DirectShow的多媒体流捕获[J].2006
注:“本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。”