高红霞, 郜 伟
(1.河南工程学院 计算机科学与工程系,河南 郑州 451191;2.信息工程大学 理学院,河南 郑州 450000)
近年来,多屏显示在监控、指挥、调度、公安、消防、军事、气象等领域获得了越来越广泛的应用.应用时,通常需要将多个屏幕或投影仪拼接成一个大的屏幕,以满足显示的需求.在此类系统中,视频画面的分割一直是核心问题之一.为达到优良的显示效果,一般选择基于硬件的视频画面分割器来实现画面的分割.目前,多屏系统中比较有代表性的是VATION PRO多屏图像处理器和QIWEI-2003多屏拼接技术,这两种系统都能提供优良的画面效果,但其昂贵的硬件成本及高端的定位无法满足大部分普通用户的需求.对于那些对画面质量要求不是太高的普通用户,低成本实现大面积的显示才是其需要的.本文主要研究利用软件的方法来处理视频画面分割,以解决成本问题.
图1 系统总体流程图Fig.1 Overall system flow chart
系统的总体设计如图1所示.用户在服务器界面选择发送桌面工作模式或发送视频文件工作模式,服务器根据局域网内连接的客户端数目确定分割方案,把桌面或视频文件画面划分为相适应的块数,并根据用户的发送配置以压缩视频流的形式为各客户端发送适当的画面以满足客户端上显示屏空间分布的需求.客户端接收服务器发来的视频流信息后,通过译码解压重建画面并向服务器端发送主机IP等有关信息.
从系统流程可以看出服务器端应实现如下功能:
(1)服务器端以视频流的形式发送本机桌面到客户端,并根据链接的客户端数目智能选择划分块数;
(2)服务器端以视频流的形式为客户端播放视频文件,并根据链接的客户端数目智能选择划分块数;
(3)服务器端为客户端选择所显示的内容以满足客户端显示屏空间分布的需求.
总的来说,服务器端主要完成桌面及视频文件的捕获、视频的分割、视频发送、视频压缩等功能,其功能模块也就相应地分为桌面捕获处理模块、视频文件捕获处理模块、视频分割处理模块和视频发送处理模块[1].
①桌面捕获处理模块
该模块利用DirectShow提供的PushSource Desktop滤波器捕获实时的桌面画面,输出一个未压缩的Video信号.
②视频文件捕获处理模块
该模块利用DirectShow提供的File Source滤波器捕获视频文件,输出一个已编码的Stream信号.
③视频分割处理模块
该模块接收未压缩的视频流信号,根据连接的客户端数目对流信号进行分割,输出相应个数的未压缩流信号.
④视频发送处理模块
该模块把分割后的流信号进行压缩后再发送到相应客户端.这里,服务器端可以设置分割后视频流信号的流向.
本文采用DirectShow编程技术,尽可能使用其本身提供的滤波器(Filter).要实现服务器功能,只需自行开发一个能接收上游滤波器传来的视频流信息并根据分割方案把视频画面划分为相应块数、之后把分割处理后的视频流信息提供给Filter Graph中下游滤波器进行下一步处理的Transform Filter.
由服务器功能可知,Filter Graph的构建并不是固定的,在不同的工作模式和分割方案下有不一样的Filter Graph.下面以发送视频文件模式下划分2个画面为例说明Filter Graph的构建,如图2所示.
图2 发送视频文件并划分两画面的Filter GraphFig.2 Send video and divide into two screen Filter Graph
图2中,A部分的构建取决于选择何种工作模式,在选择发送视频文件的情况下,服务器将选取上图的3个Filter.File Source完成视频文件的捕获工作;Splitter把接收的视频信息分离为视频流和音频流,在这里我们只需要视频流;Ffdshow Video Decoder解码所接收的视频流.这3个Filter都是 DirectShow本身所提供的,它们共同构成了服务器的视频捕获处理模块.图2中,VidoeCut Fliter根据分割方案把接收的视频流进行画面划分,分块后的视频流通过相应接口传往下游Filter.这个Filter需要自行开发,DirectShow本身并没有满足需要的Filter,VidoeCut Filter单独构成了服务器的视频分割处理模块.图2中,B部分为服务器的发送处理模块,其构建由分割方案所决定,采用动态加入Filter的形式,分割为几块就为几个VidoeCut Filter的输出接口.创建下游Filter链路,把分割后的视频流进行压缩并发送.其中,A部分在发送桌面工作的模式下时,Filter组成如图3所示.
图3 桌面捕获处理模块Fig.3 Desktop capture processing module
由图3可知,桌面捕获处理模块也由一个Filter构成,其捕获的视频流未经编码和压缩可直接传往视频分割处理模块.
服务器端设计为发送桌面和发送视频文件两种工作模式,一方面是考虑到尽可能使用DirectShow本身提供的Filter,降低开发难度;另一方面也考虑到了发送桌面和发送视频文件时捕获帧率的要求不一样,分开处理能减轻网络通信的负载.
在服务器端中使用DirectShow提供的Filter完成一些底层相关内容的操作,大大降低了系统开发的难度.我们只需知道每个Filter的输入和输出,而无需了解它是如何实现的.在服务器端主要实现了视频分割Filter(VideoCut Filter).
图4 VideoCut Filter基本框架Fig.4 VideoCut Filter basic framework
本视频分割Filter(VideoCut Filter)负责从上方的Filter接收视频流数据,按照分割方案处理后,发送到下游视频发送处理模块,属于Transform Filter类型.
本文设计Filter的最大分割块数为4块,对每一块提供预览接口,VideoCut Filter的基本框架见图4.
2.1.1 Filter及其Pin口的基类选型
视频分割VideoCut Filter选择CTransformFilter作为VideoCut Filter的基类.因为,VideoCut Filter Crossbar Filter实现的是单输入、多输出的Filter,需要将输入sample写入到新的输出buffer中,这种情况一般选CTransformFilter作为基类.
当Filter的基类选定了之后,Pin的基类也就相应选定了.VideoCut Filter输出Pin的实现,需要实现基类所有的纯虚函数,除了CheckMediaTyp进行媒体类型检查外,还有GetMediaTyp提供支持的媒体类型,DecideBufferSize决定Sample使用内存的大小,FillBuffer为即将传送出去的Sample填充数据.
2.1.2 分割原理
在DirectShow提供的CTransformFilter类中,上游Filter传来的视频流媒体结构中有一个bmiHeader数据成员,这个成员是BITMAPINFOHEADER结构[2],这个结构的定义如下:
Typedef struct tagBITMAPNFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biplanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
}BITMAPNFOHEADER;
这个结构有两个结构成员,biWidth 和biHeighto.
视频流媒体结构中还有一个rcSource数据成员,同时也有一个rcTarget成员,这里我们假设有两个Filter A和B,假如这两个Filter与视频流媒体数据类型相连,A在左边,是上游的filter ,B在右边,是下游的Filter.在这两个Filter间传递的buffer具有一定的尺寸,可以用bmiFleader.biWidth,bmiFleader.biFleight来标记.
Filter A接收到输入视频流后,将该输入视频的一部分扩展填充到buffer里面的rcTarget区域中,填充的部分的大小根据rcSource和输出数据媒体类型的大小而定,也就是rcSource和biWidth, biHeight比较.如果rcSource为空,Filter A就会将全部的输入pin拷贝到rcTarget;如果rcTarget为空,那么Filter A就会将视频填充到整个的输出buffer中.
例如:假定Filter A接收的视频图像为160*120单位为像素,假定A和B连接的时候采用如下的数据类型:
(biWidth, biHeight): 320,240
RcSource:(0, 0, 0, 0)
RcTarget:(0, 0, 0, 0)
这就意味着Filter A就会将它接收到的视频数据x方向和Y方向乘以2以后填充到320*240的输出bufer中.
本文设置的视频图像分辨率为1 280*800像素.对stream00~stream11,相应的构造RcSource00~ RcSource11,在不同分割方案下“RcSource”的值也不一样.分成4块时,媒体类型设置如下:
Stream00:
(biWidth, biHeight): 1280,800
rcSource00:(0, 0, 640,400)
rcTarget00:(0,0, 0,0)
即Stream00输出的视频图像为原视频图像的左上角1/4图像扩展为1 280*800像素分辨率后的图像.
Stream01:
(biWidth, biHeight): 1280,800
rcSource01:(640, 0, 1280,400)
rcTarget01:(0,0, 0,0)
同样的,Stream01输出的视频图像为原视频图像的右上角.
Stream10:
(biWidth, biHeight): 1280,800
rcSource10:(0,40 0, 640,400)
rcTarget10:(0,0, 0,0)
Stream10输出的视频图像为原视频图像的左下角.
Stream11:
(biWidth, biHeight): 1280,800
rcSource11:(640,400, 1280,800)
rcTarget11:(0,0, 0,0)
Stream11输出的视频图像为原视频图像的右下角,分块情况如图5所示.
图5 分块示意图Fig.5 Block diagram
图6 视频分割Filter工作流程Fig.6 Video segmentation Filter workflow
2.1.3 工作流程
视频分割Filter的工作流程如图6所示.
在开发Filter时重写了GetMediaTyp虚函数,根据分割方案为每个rcSource和rcTarget指定不同的媒体类型,以实现画面分割效果.
2.1.4 服务器端内容的智能划分
服务器端根据实际成功连接客户端的数目,自动将服务器端的显示内容划分为客户端个数的块数,显示内容的排列方式需要根据实际的要求进行手工调节,具体划分过程如图7所示.
图7 服务器端内容智能划分过程Fig.7 Server-side content divide into the process of intelligence
(1)桌面捕获模块利用DirectShow提供的PushSource Desktop滤波器来捕获即时的桌面画面[3].PushSource Desktop滤波器的基本构架如图 8所示.
PushSource Desktop滤波器捕获桌面画面后输出媒体格式为:
Major Type:Video
Sub Type:RGB32
Format:RGB 1280*800,32bit
图8 PushSource Desktop 滤波器Fig.8 PushSource Desktop filter
rcSrc=(0,0,0,0)
rcDst=(0,0,0,0)
PushSource Desktop滤波器中捕获的帧率有如下几种
// UNITS = 10 ^ 7
// UNITS / 30 = 30 fps;
// UNITS / 20 = 20 fps, etc
const REFERENCE_TIME FPS_30 = UNITS / 30;
……
……
const REFERENCE_TIME FPS_1 = UNITS / 1;
本文设置为FPS_5,即帧率为5 fps.
(2)视频文件的捕获部分主要利用DirectShow提供的File Source滤波器捕获视频文件.File Source滤波器基本构架如图9所示.
图9 File Source滤波器Fig.9 File Source filter
File Source滤波器提供了一个输出接口和一个预览接口,输出的媒体格式与源文件有关,例如源文件为AVI格式,则输出媒体格式为:
Major Type: Stream - Video
Sub Type: Avi
GUID_NULL
利用预览接口我们可以看到捕获的效果.
一个好用的程序应当有友好的界面,服务器端界面的设计如图10所示.界面左边显示了当前连接的客户端数目、本机IP、桌面捕获的预览屏幕和发送控制;右边显示了分块预览屏幕,各屏幕下的组合框用于选择本块发送的方向.服务器默认选择为发送桌面,当有客户端连接时,系统根据连接数自动选择分块方案(最多分为4块),单击开始发送之后,左侧预览屏幕出现本机桌面图像,右侧预览屏幕出现桌面分块后的图像,在组合框中选择本块发往的主机IP.点击发送视频选择框,再单击开始发送,则首先弹出文件浏览对话框,之后的控制与发送桌面一样,此时预览屏幕显示视频文件画面.
图10 桌面捕获Fig.10 Desktop capture
随着多媒体技术的飞速发展,视频技术已在越来越多的领域中得到了广泛应用.本文主要研究采用DirectShow系统来实现多屏软拼接系统服务器端的桌面捕获、视频文件捕获和视频分割.随着技术的不断发展,视频分割的准确率将会越来越高,拼接效果也会越来越好,人为交互将会减少,而运算的成本会越来越低.
参考文献:
[1] 陆其明.DirectShow实务精选[M].北京:科海电子出版社,2004:45-49.
[2] 许宏竹.基于DirectShow的流媒体的应用和研究[M].北京:北京邮电大学出版社,2007:63-73.
[3] 邱换春.基于嵌入式Linux和DirectShow的网络摄像机软件设计[M].合肥:合肥工业大学出版社,2009:36-58.