《电子技术应用》
您所在的位置:首页 > 通信与网络 > 设计应用 > 基于DirectShow的视频广播系统设计与实现
基于DirectShow的视频广播系统设计与实现
邵 林 曹汉强
摘要: 分析了DirectShow技术的结构和原理,采用DirectShow开发了视频广播系统,并介绍了其软件设计方案和实现方法。
关键词: DirectShow 视频广播
Abstract:
Key words :

  摘  要: 分析了DirectShow技术的结构和原理,采用DirectShow开发了视频广播系统,并介绍了其软件设计方案和实现方法。

  关键词: DirectShow  视频广播

 

1 视频广播系统的结构

  视频广播系统为用户提供实时语音和视频数据,服务方式类似于传统的有线电视网。视频广播系统由三部分组成:广播服务器、转发服务器和客户端。广播服务器负责音视频数据的采集、压缩和发送。转发服务器负责转发音视频数据。客户端负责音视频数据的接收、解码和回放。典型的视频广播系统结构如图1所示。

 

 

2 DirectShow程序设计原理

  微软的DirectShow技术是在Windows平台下开发流媒体程序的有效方法。DirectShow将流媒体处理划分为若干个连续的步骤。这些步骤包括音视频数据的采集、传输、分离、合并、编码、解码和回放等。一个具体的流媒体处理过程可以由其中的几个步骤组成。滤波器(Filter)是DirectShow中最基本的单元,不同的滤波器实现不同的功能,可以处理一个或多个步骤。DirectShow定义了一系列的滤波器,每个滤波器需要实现若干个接口。开发人员可以创建自己的滤波器,也可以使用微软或第三方提供的滤波器。应用程序连接若干个滤波器进行指定的流媒体处理。数据可以在不同的滤波器间传输,传输方向一般是单向的。如果数据从滤波器A传向滤波器B,则称滤波器A为上游滤波器,滤波器B为下游滤波器。传输的数据加有时间戳,用来同步音视频数据的回放。在DirectShow中,滤波器可以分为3类。

  (1)源滤波器(Source Filter):从数据源获取原始数据。不同的源滤波器可以处理一类或多类数据源,包括本地文件、网络和数据采集卡等。

  (2)变换滤波器(Transform Filter):从上游滤波器接收数据,处理后提交给下游滤波器。变换滤波器可以进行数据的压缩解压、复合分离或者其他处理。

  (3)终端滤波器(Render Filter):对数据进行最后的处理,可以显示视频、回放音频、保存数据或者将数据发送到网络等。

  利用DirectShow开发流媒体程序的框架如图2所示。

 

 

3 系统设计

  视频广播系统的软件设计有2种方案可供选择:(1)不使用DirectShow,在服务器端采用VFW或设备厂商提供的二次开发包采集数据,在客户端采用GDI或DirectDraw显示。(2)采用DirectShow的设计方案。服务器软件设计中包括源滤波器以采集视频,变换滤波器用于压缩视频,终端滤波器用于发送压缩数据;客户端软件设计也相应地包括源滤波器以接收网络数据,变换滤波器用于解压视频数据,终端滤波器用于显示视频。

  采用VFW进行视频捕获效率较低,捕获帧率只能达到15帧/秒。而采用设备厂商提供的二次开发包虽然可以获取较高的效率,但不同厂商提供的开发包风格各异,使用不同设备时需要重复编写代码。DirectShow方法可以达到较高的效率,同时在DirectShow中对硬件设备进行了封装,开发人员不需要重复编写代码。由于DirectShow已经在流媒体程序设计中得到普及,网络上有大量第三方提供的编解码滤波器,因此基于DirectShow设计的系统能够直接使用这些滤波器,从而缩短开发时间。同时因为有较多的编码方式可以选择,所以系统能够适应更多的应用环境。此外,DirectShow在处理视频数据回放时,尽可能采用DirectDraw技术,可有效地利用用户的显卡设备。可见,采用DirectShow设计的系统容易升级和维护,程序具有较好的性能。

4 系统实现中的关键技术

  (1)视频捕获

  视频广播的数据可能来自视频采集卡、USB摄像头或者TV卡等输入设备,因此服务器软件需要在不同的硬件平台上工作。DirectShow使用一类特殊的源滤波器对硬件设备进行封装。这类滤波器工作在用户模式下,使用方法与普通的滤波器相同,在内部完成与硬件驱动程序的交互,实现内核模式和用户模式间的数据交换。DirectShow支持多类设备,如VFW Capture Filter封装早期的VFW视频采集设备,KsProxy Filter封装WDM驱动硬件等。服务器软件启动时通过DirectShow提供的设备枚举功能(Enumerating Devices)查询已安装的所有视频采集设备,不同的设备选择不同的捕获滤波器进行数据采集。如果采集设备使用WDM驱动模式,在捕捉滤波器上游还需要寻找是否存在其他特定的滤波器,支持硬件提供的附加功能。如使用PV143四路采集卡时,在捕获滤波器的上游需要一个流十字滤波器(Crossbar Filter),对视频输入端口进行选择。

  (2)图标的实现

  某些场合需要在客户端的解码图像中加入图标(如公司或学校的标志)和文本(如重要通知)。这时可以在解码滤波器和显示滤波器间添加一个变换滤波器处理图标和文本。DirectShow中的变换滤波器有2种工作方式:Copy模式和InPlace模式。在Copy模式下,滤波器接收上游滤波器提供的数据,处理后拷贝到自己的缓冲区,然后将新缓冲区发送到下游滤波器。在InPlace模式下,滤波器处理完所接收数据后直接发送到下游的滤波器。由于多媒体数据量较大,数据拷贝会消耗较多时间,因此在设计变换滤波器时应首先考虑InPlace模式。但在某些场合,如设计编解码滤波器,只能采用Copy模式。

  图标文本滤波器放置在解码滤波器和显示滤波器之间,输入数据是RGB或YUV格式的未压缩图像,直接修改其中部分数据就可在图像中显示图标或文本,因此采用InPlace模式设计滤波器即可。DirectShow自带一个InPalce的变换滤波器Sample Grabber Filter。Sample Grabber Filter提供一个ISampleGrabber的接口。ISampleGrabber需要自定义一个ISampleGrabberCB接口,实现其中的BufferCB或SampleCB函数,然后通过ISampleGrabber接口的SetCallback函数选取ISampleGrabberCB接口设置回调函数。SetCallback的调用方法为:HRESULT SetCallback(ISampleGrabberCB*pCallback,long WhichMethodToCallback)。参数WhichMethodToCallback的值设为0时,SampleCB为回调函数;为1时,BufferCB为回调函数。在SampleCB和BufferCB中可以获取待显示数据,添加图标和文本。SampleCB还可以提供显示数据的额外信息(如数据格式),因此使用SampleCB更加灵活。

  (3)数据接收

  在DirectShow中,数据传输有拉(Pull)和推(Push)二种模式。在推模式下,上游滤波器决定数据传输,它将数据主动发送到下游滤波器中;在拉模式下,下游滤波器决定数据传输,它在需要数据时向上游滤波器索取,而上游滤波器不主动向下游滤波器发送数据。

  客户端软件中的源滤波器设计基于微软DirectX SDK中Memfile的例子。Memfile是一个拉模式的滤波器,解码滤波器采用循环方式向Memfile索取数据。即使Memfile中没有有效数据,解码滤波器依然会持续读取。由于客户端数据来自网络,数据总是间断到达,所以这种循环索取数据的程序执行效率低下,测试时CPU的占用率持续在100%,丢包的现象较为严重,解码画面不连续,有大量马赛克。因此需要优化解码滤波器和Memfile之间的数据传输。

  DirectShow的设计采用多线程机制,这里可以借鉴非阻塞套接字函数的方法进行优化。解码滤波器在读取数据时传入1个CEvent变量作为信号灯使用,Memfile发现无数据可读时锁住CEvent,通知解码滤波器正在等待数据,此时解码滤波器在Cevent上等待。当Memfile中有新数据到来时释放CEvent,解码滤波器再次读取数据。改进后的流程如下。

  ①解码滤波器向Memfile索取数据。

  ②如果Memfile有数据则跳至⑤,无数据则挂起线程。

  ③Memfile收到数据则唤醒线程,跳至①。

  ④线程挂起超时,跳至①。

  ⑤解码滤波器处理数据。

  在Pentium IV、256M的机器上测试客户端软件,解码滤波器采用MPEG2解码器。测试结果显示更新后的程序CPU占用率降至40%。

5  结束语

  在Windows平台下,微软的DirectShow技术是开发流媒体应用程序的有效方法。本文介绍了DirectShow程序设计的原理,采用DirectShow技术实现了一个视频广播系统。测试结果表明,该系统在运行时能够达到良好效果。

 

参考文献

1  DirectX Documentation for C++.Microsoft Corporation,2002

2  Regerson D.Inside COM.Microsoft Press,1997

3  廖义奎,王志文,韦卫星.基于视频组播的网络教学系统研究.广西科学院学报,2003;19(2)

4  何顶新,周永鹏,万淑芸.实时网络视频广播系统的设计与实现.华中科技大学学报,2001;29(3)

5  张振伟,李志淮.网络视频直播缓存系统设计.计算机工程,2002;28(8)

此内容为AET网站原创,未经授权禁止转载。