第2章 建立和生成编解码视频序列
本章要点:
▶ 公认的标准测试序列验证视频编码算法性能
▶ USB摄像头实时采集视频生成图像序列
▶ 基于DirectShow的VMR技术实现视频图像帧采集(案例一)
▶ 基于VFW回调函数实现视频帧采集(案例二)
▶ YUVviewer工程基于DrawDib函数组实现图像显示(案例三)
▶ 基于DirectDraw技术实现图像高效显示(案例四)
为有效验证视频编解码算法系统的性能及效率,通常采取公认的标准视频测试序列进行编解码处理,以对比和分析算法的工作指标;USB摄像头已经非常普及,微软的视频SDK(Software Derelopment Kit)为构建视频实时采集系统提供了便利,还有DirectShow中的VMR(Video Mixer Renderer)和早期的VFW(Video for Windows),VMR能实现高效地视频采集,VFW的回调函数实现图像帧的直接捕获;设备无关位图DIB的操作函数组,DrawDib能够快速实现BMP图像显示;低资源占用、画面流畅的DirectDraw技术实现高效的视频显示。本章通过4个案例讲解怎样运用不同方法实现视频的捕获和显示。
2.1 视频数据来源
视频编码算法是对输入的图像序列进行持续的编码,然后输出无明确物理含义的压缩码流。视频解码算法则是对码流进行解码,以还原初始的图像帧。通常,由于视频编码系统是有损编码,所以解码后的图像质量一般低于最初输入的图像。编码系统的效率或性能对不同的视频通常有较大的波动,特别是场景变换剧烈的视频,更能考验编解码系统的性能。
USB摄像头因稳定、热插拔等特点而被广泛应用于视频开发系统中,如通过USB设备捕获视频图像,用视频算法在线进行编码。
2.1.1 标准测试序列
视频编码算法对视频序列的场景切换或剧烈运动等较敏感,为公平对比算法的效率和特定区域的处理效果,质对同一个视频序列进行编码成为必然。标准视频测试序列就是为了公平、公正地对比算法系统的性能而建立的。
网站http://media.xiph.org/video/derf/提供了许多常用的测试序列,包括其他链接如http://trace.eas.asu.edu/yuv/的YUV文件,以及Y4M格式的视频文件。Y4M(YUV4MPEG2)格式的文件是一种以头文件存储视频的未压缩视频序列。简单来说,在原始的YUV序列的起始及每一帧的头部,都加入了纯文字形式的视频参数信息,包括分辨率(如‘W352’,‘H288’)、帧率(‘F30000:1001’,表示29.97fps)、逐行/隔行扫描方式(‘lp’)、宽高比(‘A4:3’),以及每一帧起始的“FRAME”标志位。但是,主流的视频CODEC(Xvid/x264)是对YUV420格式的数据进行编解码的,因此有必要做Y4M到YUV420(或I420)的转换。这里应用mencoder.exe命令行方式的视频处理软件(MPlayer的组件)进行格式转换。如下载akiyo_cif.y4m文件,现转换为akiyo_cif.yuv文件,则执行如下命令:
mencoder akiyo_cif.y4m -ovc raw -of rawvideo -vf format=i420 -o akiyo_cif.yuv
虽然x264支持Y4M格式的视频输入,为统一起见,本书的视频编解码CODEC的视频数据均为YUV420(I420)格式。
2.1.2 实时采集视频
为实现视频CODEC的PC机实时采集视频、编码、解码和显示图像,因此需要视频捕获设备,而USB摄像头支持热插拔、输出RGB或YUV,可满足应用。市面上的USB摄像头多数支持RGB及I420的图像采集,少数仅支持RGB。当实时捕获的视频为RGB格式时,需要做RGB到YUV的格式转换。USB摄像头的驱动一般为WDM模式,开发者可借助DirectShow或VFW的SDK以访问设备、捕获视频数据。