基于DirectShow的视频处理Filter组件设计与实现

时间:2022-08-30 06:02:17

基于DirectShow的视频处理Filter组件设计与实现

摘 要: 目前市场上支持视频图像处理功能的软件虽然多种多样,但通常涉及行业背景,应用范围狭窄,开放的视频图像处理组件在容错或安全性上表现一般,因此有必要创新和开发特定功能的视频处理组件。该设计基于DirectShow架构,开发出具有视频处理功能的Filter组件,具有本地图片叠加入视频流、视频编码格式转换、截取画面保存为本地图像等功能。可在视频图像传递过程中对图像进行实时处理、添加信息、优化或保存画面等,使人们以更加灵便的方式获取、使用或传播视频信息。测试结果表明,该组件可应用于广播电视传输或视频采集时的图像处理,甚至应用于美颜相机或PC摄像头的趣味叠图等,应用范围广泛,平台兼容性强,填补了市场上该类产品的类型和功能短缺。

关键词: DirectShow; 多媒体; COM组件; 图像处理; Filter

中图分类号: TN911.73?34 文献标识码: A 文章编号: 1004?373X(2016)13?0046?05

Abstract: The software supporting video image processing function is various on the market, but it has narrow application range due to the industry background. And the opened video image processing module has poor performance on fault tolerant or security, so it is necessary to innovate and develop the video processing module with specific function. The Filter module with video processing function was developed based on DirectShow framework, which has the functions of local image added into video streaming, video coding format transform, and extracting frames saved as the local image. The module can realize the operations of real?time processing, information adding, frames optimization or frames preservation for the image in video image transfer process, so people can acquire, use or transmit video information with more flexible way. The test results show that the module can be applied to radio and television transmission or image processing while video collection, and beauty camera or funny overlay of PC camera. The module has wide application range and good platform compatibility, which filled the type and function shortage of this product on the market.

Keywords: DirectShow; multimedia; COM module; image processing; Filter

0 引 言

多媒体信息在人们的生活中无处不在,随着网络平台的广泛普及和三网融合的发展[1],音、视频处理以及流媒体传输仍然是当下流行的发展和研究热点。视频信息因为包含的信息量大、内容生动,易成为人们获取信息的主要方式。如果能够在视频图像传输过程中对图像进行实时处理,添加信息,优化画面,甚至保存当前画面,将会使人们以更加灵活方便的方式获取、使用和传播视频信息,从而满足进一步的需求。

目前市场上支持图像处理功能的软件多种多样,涉及各种各样的行业应用背景。但是这些软件往往仅能在本行业工作范围内使用,应用范围狭窄。例如:直播信号的水印叠加,必须使用相应的直播信号处理软件。如果在采集视频过程中叠加水印,就必须使用Capture相关的软件才能进行。相同的功能由于应用背景的不同,导致需要使用两款完全不同的软件。本设计通过设计一个Filter组件,外部应用程序仅仅通过调用加载这个组件,即可实现相应的功能,且完全适用于各种应用背景。

多媒体软件行业中,多媒体开发主要集中于播放器等应用开发,使用第三方Filter组件搭建Graph链路,很少有专业从事底层的组件开发。这是因为Filter组件开发难度较大,使用他人开发好的Filter,能减少软件开发成本。通常开发Filter组件的公司往往是硬件制造公司的下属研发部门,为了配合自己公司制造的视频采集卡、摄像机、显卡、声卡等硬件设备,开发Source Filter用作硬件信号源的输出,或者开发Render Filter作为硬件的信号输入。随着传统网络技术的发展以及移动互联网时代的来临,行业内更多关注的是高效的压缩格式,如何用更少的体积,更短的时间,传输更多的信息。因此市面上大多数Transform Filter只具有压缩与解压功能,很少有图像处理功能。本设计弥补了市场的缺憾,基于DirectShow架构,开发出具有视频处理功能的Filter组件,具有本地图像内容叠加入视频流、视频编码格式转换、截取画面保存为本地图像等功能,可应用于广播电视传输或视频采集时的图像处理,甚至应用于PC摄像头的趣味叠图等,应用范围广泛,具有很高的开发和应用价值。

1 DirectShow和Filter介绍

多媒体开发面临很多问题和挑战,需要保证巨大量的多媒体数据高效处理、音频与视频同步、复杂的媒体源处理、各种媒体格式的支持以及目标系统中不可预知的硬件支持等。使用DirectShow,可以使程序员不被硬件差异、数据传输同步性等工作牵绊,从而能快速简单地开发出多媒体应用程序[2]。

如图1所示,图中央最大一块就是DirectShow系统,虚线下是Ring0特权级别的硬件设备,虚线上是Ring3特权级别的应用层。DirectShow系统就位于应用层中,它用一种叫做FilterGraph的模型管理整个数据流处理过程;参与数据处理的各个功能模块叫做filter,filter就好像工厂流水线上的工人一样,按照一定顺序连接并协同工作[2]。

按照功能来区分,Filter大致分为三类:SourceFilter,TransformFilter,RenderFilter。其中SourceFilter主要负责数据获取,数据源可以是文件、网络、采集卡,甚至一个摄像机,然后数据往下传输;TransformFilter主要负责数据的格式转换,例如数据流分离/合成、解码/编码等,然后将数据继续往下传输(本设计就属于TransformFilter);RenderFilter主要负责数据的最终去向――是送往声卡与显卡进行预览还是输出到文件进行本地储存。

Filter是DirectShow中最基本的概念。DirectShow使用FilterGraph管理Filter。FilterGraph是Filter的“容器”,Filter是FilterGraph中最小的功能模块。Filter框架是指完成Filter功能的一个必要的操作函数集。Filter类的使用方法包括实现一些必须的纯虚函数,可选实现的虚函数等,以完成输入和输出Pin上的媒体类型检查,决定Sample内存大小等。另外,在Filter上还要将一些状态信息设置给应用逻辑控制对象,在Filter状态转换的同时调用控制对象相应的函数(用于初始化或反初始化),以及在数据处理时调用控制对象的数据处理函数等。Filter一般由一个或多个Pin组成,Filter之间通过Pin相互连接构成一条顺序链路。通过pin可以区分三种类型的Filter。仅有输出Pin的是SourceFilter,既有输出Pin又有输入Pin的是TransformFilter,仅有输入Pin的是RenderFilter。

2 现有产品介绍

Smart Tee Filter是微软DirectShow自带的Filter之一[3],属于Transform Filter,主要用于将视频采集图像分割成一条预览流和一条视频采集流,自身内部没有任何额外的数据复制,输出引脚支持任何媒体类型的上下游连接。当一个视频采集Filter不提供单独的引脚给采集流和预览流时,可以接一个Smart Tee Filter。Smart Tee Filter提供预览图像功能并且不会伤害采集流的工作性能。它也消除了预览流的PTS。

Smart Tee Filter的优点是:支持的视频编码格式众多,适配大多数常见的编码格式;预览流链路工作状态堵塞不会影响采集流链路,避免了录制档案丢帧的情况发生。但其也有不可避免的两个问题:

(1) 可能导致图像成为倒置或镜像(这取决于视频编码)。因为正是适配了大多数编码格式,对于极少数不常用的格式,不同公司编码规范不统一,造成Buffer内数据存放顺序不一致,导致图像倒置或镜像。

(2) 预览流的视频数据不能进行有时间判断的操作。例如,叠加一张图片使其持续一个固定时间,或者校准音频数据与视频数据使它们保持同步。这是因为预览流的视频数据进行了去时间戳操作,数据没有参考的时间戳就不能计算画面帧之间的时间间隔。

视频加密Filter组件[4]是又一款Transform Filter,采用选择性加密技术。其优点是:加密的数据量小速度快。这是因其选择性加密不改变码流格式,不会增加码流所致;使用灵活。加密的安全性和加密的效果根据选择提取加密的系数种类有关。提取全部加密参数,可以获得最高的安全性。

但在具有上述优点的同时,加密的速度稍受影响。因此仅提取部分参数,可以获得安全性和加密速度的折中,在使用中需要灵活地选择。

从以上两个同类产品中可以看出,Filter是一个很矛盾的东西,往往为了某一方面性能提高而牺牲一些其他方面的性能。Smart Tee Filter中为了适应更多的媒体格式,不可避免的会有一些容错方面的瑕疵;视频加密Filter为了获得最高的安全性,加密的速度就会有影响。当然,究其原因还是与Buffer大小、读写速度、视频数据庞大、一定时间与空间仅仅能传输定量的数据有关。想要更高的数据质量(尤其是更大的数据量)就必须延长数据传输时间;而想要更快的速度(指视频数据的流畅度)就得缩减处理的数据量。

3 Filter的需求和设计

本设计中Filter组件具体满足了以下需求:输入Media subtype为YUY2。输出Media subtype为RGB32。支持Overlay 自由产生的1 b和24 b位图。Overlay的位图可以选定坐标、旋转和翻转。可以设置Overlay持续的时间。可以截取Video的画面。截取的图片保存为1 b和24 b位图。

Filter设计中,在总结同类产品的优缺点,保证平台兼容性的同时,保证数据控件与时间的最大利用率和同步工作,具体做了两点改进:

(1) OutPin与Input上的Buffer只做数据传递的用途。所有图像叠加,视频编码格式转换使用的Buffer一律是新的。数据传递时仅将新的Buffer内容拷贝到相应的Buffer上一次。因为OutPin与Input上的Buffer其实是显存上的空间,视频处理必然会对数据Buffer进行多次操作,多次读写显存数据,从而影响显卡性能,造成视频画面卡顿。而使用本设计的方法,每一次传递数据仅仅读写显存数据一次,其他操作都在new出来的内存Buffer上进行,对Graph性能影响减少到了最小。

(2) 不改变OutPin与Input上的Buffer大小,Graph的大小决定实际使用Buffer的大小。因为视频数据一帧往往几MB的数据量,如果更改大小就需要重新找一块巨大的连续内存空间,这对于平台系统的开销是巨大的。以画面为1 080×720@30p RGB32格式计算,每秒需要额外创建与释放1 080×720×30×8×4=746 MB的内存,则Graph的性能在当前硬件环境下不会很高。

Filter设计需要完成两件事:父类选择和应用结构设计。选择合适的父类至关重要。Filter框架是完成Filter功能的一个必要的操作函数集。本设计使用CTransformFilter作为父类,不用重新设计Pin,CTransformFilter已做好了封装。Filter是一个支持“输入数据内部处理输出数据”过程的应用框架,其最重要的部分是应用逻辑,也就是内部处理部分,指明了这个Filter的本质功能[4]。 本设计将应用框架与应用逻辑分离。视频数据由Filter组件处理,将视频图像每一帧的YUY2编码数据输入一块Buffer交给视频编码格式转换模块处理成RGB32数据,存进另一块Buffer,再传回Filter组件由应用框架处理接下来的工作。

本文的应用结构设计如图2所示。

图像处理部分的工作就是对回传Buffer进行处理。由外部位图数据加载模块把数据叠加到回传Buffer,或者通过复制回传Buffer内容到内部数据位图写档模块进行文件的写档,以完成Filter的相应功能。如果需要对这个Filter添加新的功能,只需增加新的模块。例如图像色彩调节功能,可以写一个对Buffer颜色改变的模块,叠加进去,不会对整体造成影响。由此可得到一个结构清晰,扩展性良好的Filter。

4 Filter实现

4.1 实现COM框架

Filter就是一个COM组件,所以需要添加符合COM规范的代码,也就是实现EXPORTS中声明的一些函数[5]:

DllMain:DLL的入口函数,跟exe有个main或者WinMain入口函数一样。

DllGetClassObject:用于返回classfactory对象指针。

DllCanUnloadNow:组件中的输出函数,以确定Dll是否可以被卸载。

DllRegisterServer:用于注册组件,在Windows的注册表中给该Filter登记,使之能够索引到该Filter,然后创建组件。

DllUnregisterServer:在Windows的注册表中取消该Filter登记。

4.2 实现Filter框架

正式编写Filter之前,需要在COM框架的基础上实现Filter的框架,具体涉及以下信息:

(1) Pin及Filter的信息

设计的Filter具有两个Pin,一个输入Pin,一个输出Pin。Pin上面接收的媒体类型是Video,同时还为该Filter实现了一个属性页。

(2) 自定义接口以及接口函数

自定义接口是组件外部使用组件的“钥匙”。在视频处理Filter的接口中一共定义了11个函数供外部调用,以完成Filter与外部应用所有的交互。只要接口保持不变,就可以通过更换Filter完成对其更新迭代的工作,不会对外部应用有一点影响。

(3) Query接口指针

此部分的功能是将Filter所有接口暴露给外部应用。外部应用通过Query接口的GUID获取指针指向相应接口,完成相应功能。这里一共暴露两个接口给外部应用,分别是属性页接口与上文的自定义接口。主要代码如下:

(4) 重载框架函数

使用CTransformFilter类必须重写五个函数,作用分别如下:

CheckInputType():确定本Filter接收的输入格式,目前仅设计支持YUY2格式的视频媒体输入,当然还可设计支持其他格式的媒体输入。

GetMediaType():确定Filter的输出格式,目前支持输出RGB32格式的视频媒体。

CheckTransform():检查输入和输出是否匹配。这里的输入与输出并非对于本Filter而言。DirectShow系统用FilterGraph模型管理整个数据流处理过程,参与数据处理的各个功能模块就是Filter。Filter就是工厂流水线上的工人,按照一定顺序连接并协同工作。这里的检查输入和输出是否匹配是指检查上一级Filter的输出Pin与本Filter的输入Pin的媒体类型是否匹配,以及本Filter的输出Pin与下一级Filter的输入Pin上的媒体类型是否匹配,这是DirectShow系统的精髓所在,该机制保证了FilterGraph这一条流水线能够按部就班地输送数据,各个Filter能够各司其职、协同工作。

DecideBufferSize():该函数用于确定输出Buffer的数量大小。由于显存、内存等设备的存储特性(4 B对齐),设定的Buffer大小要略大于实际需要使用的Buffer。

Transform():使输入变为输出的处理函数。该函数把Buffer传出到应用逻辑部分进行处理,处理完成后再传回,所以它并不充当应用逻辑部分,而是作为应用框架与应用逻辑的纽带。

4.3 应用逻辑实现

应用逻辑是指对输入数据进行处理的一套控制策略。数据如何输入,处理完后如何输出由Filter框架负责,应用逻辑更多的是指数据处理的算法实现,效率优化等问题。应用逻辑控制对象一般以Filter的一个复合成员对象的形式出现。

上一篇:秩序图片对女大学生信任的影响 下一篇:基于小波基的压缩感知重构算法设计