APP下载

DirectShow在船舶视频监视系统中的应用

2013-01-11,,

船海工程 2013年4期
关键词:监视系统调用数据流

,,

(中国舰船研究设计中心,武汉 430064)

视频监视系统以其直观、准确、及时和信息内容丰富而广泛应用于许多场合。在船舶领域,视频监视系统在安全防范,灾害发现与确认,信息获取等方面也有着普通传感器无法比拟的优势[1-2]。

在灾害发生时,通过的视频,可以确切地获知船舶的安全状态。直观的信息有利于指挥员能够快速准确地处理分析现场情况,有效地组织各种力量采取应对措施,减轻甚至消除灾害所带来的影响,将舰船维持在正常或接近正常的状态。

DirectShow是一个处理Windows平台上各种格式的媒体文件的播放、音视频采集等高性能要求的成熟技术。DirectShow不但能支持多种音视频编解码器和多种媒体类型并提供高品质的媒体流解码和回放,而且能够封装硬件差异驱动接口[3],及用与设备无关的方法提供设备相关的性能。基于DirectShow以上的优势,本文采用DirectShow开发船舶监视系统。

1 DirectShow简介

DirectShow 是一个基于COM(组件对象模型)系统的一个开放性的应用框架,由许多模块化的软件组件组成[4]。DirectShow系统功能见图1。

DirectShow系统位于Ring3特权级别应用层,它使用Filter Graph模型来管理整个数据流的处理过程。Filter是用于处理数据的功能模块,它在Filter Graph中按一定的顺序协同工作,Filter分为3类:Source Filter、Transform Filter和Rendering Filter[5]。

图1 DirectShow系统

Source Filter主要负责获取数据和前期的处理,并把数据往下传输。数据源可以是文件、采集卡、数字摄像机等。Transform Filter主要负责数据格式转换,并把数据继续往下传输。完成数据的分离与合成、解码盒编码等。Rendering Filter主要负责将数据传输给显卡、声卡等硬件设备进行多媒体的播放,并把数据流转换成文件进行存储。

Filter包含一个或多个Pin,Filter通过Pin进行连接,使数据构成一条顺序的链路。由于Source Filter和Rendering Filter分别为数据流的起点和终点,所以Source Filter不包含输入Pin,Rendering Filter不包含输出Pin。

2 设计Source Filter

2.1 选择合适的父类

开发Filter,选择合适的父类,不但能减少编程和调试的工作量,而且能有效地降低出错率。DirectShow SDK已经根据各种不同的应用从CbaseFilter派生出了相应功能的子类。所要定制的Source Filter是一个实时源,同时需要在属性页中设置摄像头的IP地址及其端口,以及帧速率,边界大小等属性。

选择CSource类和CPersistStream类作为将要开发名为Finley’s Video Filter的Source Filter的父类。CSource类和CPersistStream类结构见图2。

图2 CSource类和CPersistStream类的结构示意

CSource类作为一般推模式Source Filter的父类,而CPersistStream类用于实现属性页。

2.2 数据的传输

Sample是一个封装了一定大小数据内存的COM组建,它被用来传输Filter之间的数据。两个连接的PIN共享同一个命名为Allocator的Sample分配器,用来创建、管理一个或多个Sample。在数据传输时,上一级Filter的输出Pin调用ImemAllocator::GetBuffer函数,得到一个空闲Sample的数据内存地址,并放入数据。然后再将这个Sample传送给下一级Filter的输入Pin。数据从上一级Filter的输出Pin传送到下一级Filter的输入Pin,并没有进行数据的内存备份,而只是数据到达的通知。所以Pin的连接只是一个虚拟的逻辑连接,这样做减少了所占用的资源并提高了运行效率。

Filter的数据传输分为推模式(push model)和拉模式(pull model)两种形式。由于本系统用于船舶的视频监视系统,所以采用的Source Filter属于实时源(live source)。它能够自己产生数据并用专门的线程将这些数据往下推送。数据从Capture Pin出来,调用数据流的下一个Filter的输入Pin上的ImemInputPin::Receive函数,实现Source Filter到下一个Filter的传送。同样,下一个Filter也调用ImemInputPin::Receive进行数据的接收。

2.3 重写重要方法

由于Filter都是COM组建,除了要重写CreateInstance、NonDelegatingQueryInterface等函数外,还需要重写CSource类和CPersistStream类中特定的虚函数。

CSource类的派生类要创建各个CSourceStream类实例。

GetMediaType:提供输出Pin上首选媒体类型。

CheckMediaType:链接媒体类型的检查。

DecideBufferSize:决定数据传输单元Sample的内存大小。

FillBuffer:在Sample中填充数据。

由于这4个函数是用于Filter之间的媒体协商的,应把它写在CMonitorVideoPin中。

CPersistStream类主要是实现Filter设置界面的类,它的派生类要实现两个重要的函数。

WriteToStream和ReadFromStream:用于写入和读取Filter设置的信息,如数据流的大小,IP地址,端口号,透明度,帧速率等,其中所有的属性需要写相应的实现函数。

2.4 注册

Filter是一种组件,使用前必须注册。首先需要为新Filter生成一个新的CLSID,同时要为属性页生成GUID。使用系统中的GuidGen.exe程序生成GUID,然后在命令行状态下执行“regsvr32 Finley’s Video Filter的绝对路径”即可。

3 船舶视频监视系统实现

3.1 实现环境

本文硬件采用DS-2DF1-512海康威视摄像头,采用千兆网与计算机相连。软件采用VC和DirectShow库编写Source Filter,采用C++Builder编写监视软件。

3.2 创建Filter Graph

Filter Graph是Filter的容器,是Filter链路的组合。首先在GraphEdit程序中加载所创建的Source Filter。Transform Filter和Rendering Filter分别采用DirectShow SDK提供的Color Space Converter和Video Mixing Renderer 9。把它们的输出Pin与输入Pin以此连接,见图3。

根据实际需要对Filter的属性进行设定。其中由于Color Space Converter不是CPersistStream的派生类,所以不能设置属性。

图3 Filter Graph结构示意

完成所有设置之后对Filter Graph进行保存。在主函数中调用API函数LoadGraphFile加载Filter Graph即可显示实时视频。

3.3 运行状态

Filter有停止(Stopped)、暂停(Paused)和运行(Running)三种状态。暂停可以认为是数据准备就绪状态,也是停止与运行之间切换的中间状态。所有Filter是通过IMediaFilter的接口方法来控制状态转换的。暂停和运行两种状态基本上是相同的,暂停只是阻塞了数据传输的线程。在本系统中因为Finley’s Video Filter是一个实时源,暂停过程中采集的数据已经失去了实时性,所以并不要求在暂停状态下启动数据传输。在这种情况下Video Mixing Renderer 9在暂停状态下是接收不到任何Sample的。由于暂停和运行基本相同,而暂停又是运行与停止的中间状态,下面着重讨论停止与暂停两个状态的切换。

停止→暂停。从Video Mixing Renderer 9开始进行暂停状态的转换,同时Filter调用所有Pin的Active函数进行初始化,从后向前进入就绪状态。当Finley’s Video Filter进入就绪状态并启动数据线程,开始发送Sample后,则状态转换完成。

暂停→停止。Video Mixing Renderer 9进入停止状态时,调用所有Pin的Inactive函数,使上一级Filter调用IMemAllocator::GetBuffer脱离阻塞状态,并终止所有Receive函数的等待,直到Finley’s Video Filter进入停止状态。

3.4 其它功能

其它的功能只需要设计新的Filter或采用DirectShow框架提供的相应的Filter,组成相应的Filter Graph即可实现。实现视频流的文件存储实现,只用在实时视频播放Filter Graph中的Transform Filter后增加一个PIN,并把数据推入相应的File writer Filter中即可。实现视频文件播放,在相应的Filter Graph中采用AVI/WAV File Source作为Source Filter即可。这些都是DirectShow SDK中提供的Filter,若需要其它特殊的功能则需要自己定制Filter。本系统自行定制了Finley’s File Source Filter用以视频文件播放。

4 结束语

视频监视系统满足船舶行业日常安全管理和及时发现灾情和隐患的需求,具有占用资源少,可移植性强等优点,为对数字视频信息做进一步的处理,实现智能监控打下基础。

[1] 韦 磊,张英俊,付潇潇,等.船舶视频监控系统的研究[C]∥中国航海学会2006年度学术交流会优秀论文集,北京:中国航海学会,2007:184-186.

[2] 曹 辉,张均东,宋 威.视频技术在船舶领域中的研究与应用[J].船海工程,2007,36(3):122-125.

[3] 黄振宇,王 敏,吴 涛.基于COM的Directshow Filter实现[J].微机发展,2004,14(5):113-116.

[4] 涂 超,叶家玮.基于Direct Show的桥区船舶视频采集系统开发[J].船海工程,2009,38(4):121-123.

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

猜你喜欢

监视系统调用数据流
数据流计算研究进展与概述
汽车维修数据流基础(上)
汽车维修数据流基础(下)
北极监视系统
核电项目物项调用管理的应用研究
美国天基空间监视系统概述与分析
系统虚拟化环境下客户机系统调用信息捕获与分析①
AADL端对端数据流一致性验证方法
创新的摄像监视系统取代车外和车内后视镜
被动成像广域空中监视系统综述