视频编解码平台思路
视频编解码平台是一个基于PC平台的程序。它由视频采集、处理、显示和传输四个部分组成,其中视频采集和视频的处理是重点。
功能是通过摄像头采集视频数据,对采集的数据进行编码压缩;压缩后的数据可以保存在存储设备也可以传输给另一PC,经过解码,显示出视频信息。其功能模块如框图2-1所示。
图2-1 视频编解码平台基本框架
2.2 视频编解码平台方案
视频编解码平台由VC++ 6.0 编写,所以主要使用MFC中的库实现相关功能功能。其中视频采集和图像显示有几种可行的方案。
2.2.1 视频采集方案的选择
视频图像捕获一般有两种方法,一种是利用视频捕获卡所附带的SDK开发工具,这种捕获方式的实现是与设备有关的,依赖于视频捕获卡和摄像头的类型,不利于灵活应用;另一种是微软公司的开发包:DirectShow和VFW。它们提供的接口可以被大多数的视频采集卡支持,有多种视频压缩驱动可供选择。借助DirectShow和VFW,程序员可以通过发送消息或设置属性来捕获、播放和编辑视频剪辑。视频捕获最简单的形式就是视频采集,然后实时显示采集到的活动视频图像。
VFW是Video For Windows的缩写,是Microsoft于1992年推出的关于数字视频解决方案的一个功能比较强大的SDK 包。C++的封装特性在VFW的编程应用中得到了充分体现。它使得视频数据的采集和编辑工作得以简化。VFW的一个关键思想是设备无关性和开放性,即播放视频时不需要使用专门的硬件设备。它能够灵活地实现从模拟视频源采集数字视频信号,并将其存储到文件中或直接对视频缓存进行处理[3]。
DirectShow是Microsoft提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。DirectShow为多媒体流的捕捉和回放以及格式转换或编解码方面提供了强有力的支持。运用DirectShow,可以很方便地从支持WDM 驱动模型的采集卡上捕获数据,并且进行相应的数据处理或存储到文件中,而且它能自动发现硬件的媒体加速能力并加以利用,以提高应用的效率,优化效果。DirectShow 广泛地支持各种媒体格式,包括ASF、MPEG、AVI、DV、MP3、WAVE 等,使得多媒体数据的回放及编码处理变得轻而易举。另外,DirectShow还集成了DirectX 其它部分(比如DirectDraw、DirectSound)的技术,直接支持DVD 的播放、视频的非线性编辑以及与数字摄像机的数据交换。另外,DirectShow 提供的是一种开放式的开发环境,可以根据自己的需要定制自己的组件[4]。
由此可知,VFW虽然在功能上弱于DirectShow,但是对于本设计来说,VFW功能已经能满足实际需求,而且其使用简单,同时VFW支持软件平台小,节省系统硬件,运行稳定可靠,因此本设计视频采集模块采用VFW方法。
2.2.2 图像显示方案的选择
VFW显示采集的图像可以有两种方法:一种使用VFW中的视频显示宏实现;另一种是使用VC的DrawDib函数组实现。
VFW的视频显示宏在显示视频时提供两种模式,PreView 和OverLay。在预览模式中,视频帧先从视频捕获卡传到系统内存,接着采用GDI函数在捕获窗中显示,要占用CPU 资源,该显示模式所支持的视频采集格式为RGB格式。通过capPreview 宏实现。叠加模式中视频捕获将VGA卡的输出信号和自身的输出信号叠加后形成组合信号显示在计算机监视器上,不需占用CPU资源,该显示模式所支持的视频采集格式为YUV格式。通过capOverlay宏完成。叠加模式速度较预览模式快,但如果需要在视频显示前对视频信号进行处理,则必须使用预览模式。Preview模式和Overlay模式都只是用以显示。与采集的过程并无多大关系。它们主要应用于采集帧的本地回显,不能用来显示处理之后的图像。
DrawDib函数组是Microsoft的针对与设备无关位图(DIB位图),在其WIN32 SDK的Multimedia中提供的一组绘制DIB位图的高性能函数组。DrawDib函数组是一组不依赖于图形设备接口(GDI)函数,而直接操作显存的函数组。它们支持8位、16位、24位和32位图像深度的DIB。DrawDib函数组提供了将图像拉伸和抖动的功能,还支持图像的解压、数据流以及更多的显示适配器[5]。
DrawDib函数组技术特点如下:
(1)颜色信息表格式。DrawDib函数组只支持颜色信息表格式为DIB_RGB_COLORS格式的图像。
(2)光栅操作模式。DrawDib函数组只能使用SRCCOPY光栅操作模式。
(3)视频及动画回放。DrawDib函数组支持数据流应用,诸如视频片和动画序列。
(4)显示适配器。DrawDib函数组支持使用4位图像深度提供16色调色板的VGA适配器,使用8位图像深度提供256色调色板的SVGA适配器和使用16位、24位和32位图像深度提供成千上万种颜色的真彩色适配器。DrawDib函数组还使用了受限制的潜在能力提高了图像在显示适配器上的速度和质量。例如,当使用8位的显示适配器时,DrawDib函数组有效地将真彩色图像抖动为256色;同样的,使用4位的显示适配器时,它们也将8位深度的图像抖动成4位。
(5)图像拉伸。DrawDib函数组用源矩形和目的矩形来控制一个图像显示的部分。可以通过改变源矩形和目的矩形的位置和大小来裁剪一幅图像不需要的部分和拉伸某部分。
(6)压缩图像。DrawDib函数组支持好几种压缩和解压方法,其中包括游程编码,JPEG,Cinepak和411YUV。
在设计中,根据实际需要使用DrawDib函数组来实现图像的显示。
2.3 主要难点
本课因为微软在MFC中提供了相关的库,用以实现视频捕获,视频显示,数据传输,要想实现各部分功能都是相当容易的。难点在于将各部分按照一定关系结合起来,让几个部分能协同工作。