张宛怡,张 尧,周启炜
(中国空间技术研究院西安分院,西安 710100)
近年来图像处理是一个非常热门的研究领域,而图像视频的存储问题更是吸引了许多研究人员的注意。如何实现图像视频的压缩以便高效存储,实时传输是本文的主要研究内容。H.264编码容错性很高,图像质量强,编码率低等优秀特性是传统编码所不能比拟的优点,基于这些优秀的特性,无论是远距离还是近距离的网络信号传输,都有着H.264编码的用武之地。目前,H.264已经成为了许多国家高清TV 或者网络电视的视频压缩标准,因此了解H.264视频压缩标准的基本内容,设计一套基于此编码标准的实时压缩视频系统,是非常具有研究价值的[1]。
JVT(由ISO/IEC 协会联合ITU-T 组织形成的视频媒体机构)制定的H.264编码是目前功能最强大,特点最突出的视频压缩编码。起初,为了同传统的编码制相区别,H.264的功能模块实现被划分成了三个不同的档次,划分级别的依据通常是不同的设计需要,比如视频压缩的像素块大小等等其它的功能实现细节。由于实际工作的不断深入与细化,在2007年,JVT 结构又在原有的三个划分级别上重新添加了一个级别,自此H.264编码的档次多了一个高级档次,该级别相较于原有的档次而言,主要优点是增加了自适应块变换量化矩阵,同时增加了4:2:2与4:4:4采样两种不同的格式,在此基础是利用扩展像素大小只12bit 的方法追求更高的压缩率[2]。
H.264编码的特点还有很多,在具有很高压缩率的同时,因为结合了多种参考帧模式预测、多模式运动估计、整数变换及量化、环路滤波和先进的熵编码技术等高新技术的原因,H.264编码的效率得到了很大的提升。以整数变换及量化举例,编码中选择利用预测值与实际值计算两者残差,然后针对计算得到的残差再做进一步的整数变换和量化操作,整理数据,使得数据最大程度的简洁化,并利用熵编码消掉冗余部分,提高视频压缩的效率,节约储存空间,减轻硬件成本。
H.264编码的这些优点都主要是英文其H.264编码器利用的是内容较为简单的CAVLC 熵编码,而不是其他复杂的编码形式[3]。
首先给出H.264编码器的一般性结构框图,如图1所示。
图1 H.264编码器结构
根据上图可以给出H.264编码器编码的过程描述:首先H.264编码器依照率失真的计算结果可以对正在处理的数据包进行帧间亦或是帧内预测,如图左上角所示,之后等待编码模块与预测结果两者之间的运算结果,一般是两者相减就能得到中间数据Dn,然后对该中间数据进行整数变换与归一量化等一些列的数学处理操作,目的是为了得到一个由残差系数构成的矩阵数据量,根据这个计算得到矩阵进行矩阵运算与换维计算,之后再进行熵编码与反量化,注意要将熵编码的结果及时的存储到NAL 之中,根据反运算得到的结果来与预测模块进行相加运算并滤波,就可以分别得到帧内预测与帧间预测的判断参考数据。
本节介绍实时视频压缩系统硬件部分,实际上由于H.264编解码系统比较直观明了,大部分过程都是整数运算,计算难度低,因此实际上非常适合用硬件来承担一部分的高效并行计算过程,减少整个计算过程的时间,增加系统的实时性。其实这也是H.264编码的一个侧面优势。
硬件系统最关键的部分是DM6467芯片,上位机是以基于Linux 操作系统的软件开发平台进行构建的[4][5]。系统的数据采集部分,选择使用CCD 与TVP5150两者的视频摄像采集系统,采集完所有的数据之后,利用H.264编码对视频数据进行编码,并通过RTP 协议与上位机进行通信工作,完成数据的上传,视频数据上传的同时,上位机采用视频播放器就可以完成顺利接收与播放工作。
上述的数据流传输过程实际上主要由信号采集与数据上传两部分组成。视频采集过程中采用的数据格式一般选择BT.656,BT.656是一种常用于模拟信号采集的信号传输标准,主要是因为该格式的视频数据针对于高清或标清的视频所设计,时钟频率一般为27MHz,采样频率灰度与色度分别是12.5MHz 与6.25MHz。另外,整个采样过程的完成者主要包括CCD 摄像头与解码器。解码器的作用是至关重要的,它负责将收集到的数据进行解码,并通过DM6467的VPIF 视频接口接收,之后将视频数据存储到数据缓存区,为后续的进一传输工作做好准备。DM6467是一款视频信号处理的专用主控芯片,它的功能十分强大,包含多个不同高主频频率的子系统,常见的比如arm968EJ-S 子系统和DSP子系统,具有处理高清数字媒体数据的能力,具有十分高效的传输速率。除了这些子系统之外,芯片好包括许多空间大小不同的存储器,比如DDR2 存储器、NAND Flash 存储器、,同时还包含着前文提到过的TVP5150解码器与CCD 摄像头以及多功能的外围接口。从功能上来看,不同的存储器作用不同,举例来说,Flash 存储器的主要功能是启动整个芯片系统,相当于PC 机中的C 盘,该存储器里存放的资源种类主要是比较重要的文件以及驱动程序与少数的应用程序。而DDR2存储器的目的是为整个系统提供运行空间,充当视频数据传输过程中的色彩与色度转换的空间。
谈到视频压缩编码硬件结构设计,首当其冲的就是码率控制莫魁岸,如何基于软核Micro Blaze 来简易准确高效的实现码率控制,同时通过通信端口与外围设备实现数据交流与通信,是这个模块主要应该实现与满足的功能。考虑到码率控制模块可以说是前后两个编码图像之间码率控制的桥梁,这就从侧面决定的码率控制模块在整个硬件结构中所处的位置以及其春哥徐应该具备的被执行顺序,显然意见,码率控制模块的编码程序必须在前后两帧连续的编码图像之中被执行,这其实在一定程度上也是为了保证该模块高效的运行速度,不会造成程序执行阻塞,下面会具体的介绍码率控制模块硬件结构所实现的控制算法,具体可以分为三个步骤:
首先,在第一个步骤里需要参考码率控制常用算法的类型以及各自的优缺点,选择一块与本系统的硬件结构设计要求最相近的平均比特率模式算法,也就是常说的ABR 算法,该算法的主要计算原理是利用待编码图像的复杂度来调整其量化参数,同时还需要通过已编码图像的真正比特数与一整个视频图像序列的目标比特数的比特因子来调节待编码图像的量化参数,使得两个值之间的差距尽可能的缩小从而达到控制的码率的目的。
其次需要根据第一步中选择的算法类型设计合适的Micro Blaze 软核,对其IP 参数进行取舍,主要依据的是码率控制计算过程的中计算类型与复杂程度以及编码执行的顺序。通常而言,码率控制计算会包含很多的浮点型数据计算以及幂指数计算,这就需要为该算法专门设计一个适合处理此类计算的软核,尽可能的提高计算速度与运行效率,最大程度的优化算法编译环境。
完成步骤一与步骤二之后,最后需要在SDK 的编译环境之下对算法进行结构优化与参数修正,使得算法变得更加简洁优化,更加健壮。另外还需要注意的是算法程序要具有一定的安全性,注意信息安全的保护。
上面的步骤是根据经验总结的一般设计流程,具体的码率控制模块设计细节还需要在程序执行的过程中去根据实际情况再具体修改,优良的硬件系统能够更好的实现算法的高效并行计算特性,极大地加快程序执行速度,使得视频压缩系统的实时性更加高,更加可靠。
除了码率控制模块之外,H.264视频压缩标准决定了硬件系统的设计还应该要重点考虑到设计一个存储空间专门用来处理前文提到的在宏块操作前需要提前准备相邻宏块的参考信息,这些参考信息通常都包含着后面预测模块所需要的预测参照数据,其重要性肯定是不言而喻的。具体来说,其中的参考信息还包含着待编码宏块进行预测时的参考像素与重建像素,以及两两相邻的宏块亮度块数据与色度块的预测类型等等。而从系统实现功能的逻辑层面上来说,采用该宏块参考信息加载与实时更新的模式虽然使得整个系统运行更加高效,逻辑实现更加的简单,这是因为系统仅仅依据宏块存储空间的索引号就可以轻松的提取到相关的参数数据信息,但是这无疑就给硬件结构与硬件资源带来了相当程度的压力。为了解决该隐患,适当程度上的减轻硬件结构压力,降低硬件设计的成本,如果每个编码的宏块只是需要考虑在它右方和在它下面的宏块存储空间,那么理论上来分析,不会超过两行存储宏块的参考信息,这里所指的两行参考信息其实际上也就是参考编码宏块的宏块行与其上一宏块行。综上所述,考虑到前文中宏块参考信息的加载方式与消耗的时间,以及更新实现方式存在的一些缺点,决定采用只存储单行零一个的宏块参考信息的实现方式实现节约硬件资源的目的。
实时视频压缩系统采集到的数据经过信号传输通道传到PC机这个过程实际上包括了信号电路的处理,在一定帧频下的数据压缩以及一定速率的以太网传输过程。系统核心主控芯片包含ARM 与 DSP 两个处理器内核,其中两个内核主要负责的功能有一定区别,概括来看,DSP 内核实现的功能主要跟信号处理有关,比如编解码器控制、音频处理以及视频内容分析等等。而反观ARM 内核,其主要负责的内容主要是运行Linux 等操作系统。本文设计的软件系统就是基于Linux 操作系统。
在上位机中编写视频图像压缩的程序时,待处理的彩色图像数据在不同的程序语句要求下进行各种不同形式的数据转换。常见的一种模式转换是Y 分量的图像压缩发送,该模式下需要从待处理视频图像中逐帧提取到Y 分量,并将其转变成xDM 标准接口的数据格式,再创建Codec engine 对象,调用恰当的算法对视频进行压缩;还有一种常见的转换模式就是直接在H.264编码制的规定下利用Codec engine 调用xDM 程序对视频数据进行压缩,压缩完成后对视频数据进行封装与打包,数据被上传到上位机制指定空间后进行编码与解压缩,通过播放器进行视频播放,完成视频显示操作。系统数据流程如图2所示。
图2 系统数据流程图
H.264编码的优点十分明显,例如前文所叙述的那些,不过由于为了追求高效性,其算法以及程序的复杂性导致开发设计的压力就很大,必须在算法以及程序流程的设计上下一翻功夫,本节就是从这个角度出发,来对软件系统关键部分的设计深入研究。
4.2.1 编码库的调用与通信过程
H.264编码库源码被下载解压打开后需要先调用指定命令来对其进行初始化与配置更改,然后用指令语句对其进行编译的操作,如果不能正常进行编译,需要查看是否是编码源库下载不完整,亦或是编译程序有问题导致过程没有被全部执行。如果编译非常顺利的话,就可以下一步操作,即对图像数据输入流进行帧的编码工作。在这之中,值得注意的是需要在编译文件目录下找到一个.o 文件并将其删除,此文件的存在极易引起编译服务端程序出错,使得程序变编译不能得到正确的结果。
服务器程序的编写工作并不是十分复杂,实际上类似于JAVA SE 中网络编程的客户端与服务端基本通信的过程。其中服务器编程所要调用类主要就是Socket 类,众所周知Socket 编程的方式最常用的就是两种,即TCP 与UDP 两种,这两种方式的区别主要在于套接字的形式不同,这里不做详细的说明,本文选用的是UDP 网络编程来实现软件系统编码过程的设计与通信功能。
4.2.2 接收图像的播放器设计
设计接收端媒体播放器的出发点是要基于Linux 操作系统,并且该播放器最好要能够支持大多数的媒体视频格式,要有很强的实时接收数据能力,本文拟采用的是Linux 操作系统下的DirectShow 流媒体框架,该该框架与Linux 系统高度契合,功能强大,适合用于作为本软件系统播放器的开发框架。
系统的硬件系统与软件系统设计完毕后,需要尝试运行整个视频压缩系统。首先检查所有的硬件部分,查看各设备是否连接正常,各模块之间通信是否正常,严格杜绝丢包现象的发生,硬件部分初步检查完毕后,需要利用短剑系统在仿真环境下安装操作系统,并且烧录算法与程序文件到主控芯片中去。之后运行程序,观察视频传输与播放是否正确,为了评估视频压缩传输的质量,需要将视频按帧截图进行分析,与采取H.264编码压缩传输之前的视频采集图像进行充分的比较分析。对比发现该实时视频压缩系统实时性满足要求,延时时间较低,视频压缩的速度与质量很强。本次实验视频在数据采集方面花费的时间为3分钟,采用的视频输入格式选择的是常见的PAL 格式文件形式,帧率设置的是25帧/s,视频图像分辨率为720×576,记录未压缩视频数据率是125Mb/s。编码实现后视频图像数据信号的码率设置成800 kb/s。依据码率公式[码率](kb/s)=[文件大小](字节)X8/[时间](s)/1 000,计算压缩后视频数据量仅仅只有18Mbyte,综上所述,视频压缩效果非常可靠,其中压缩比为156.25,达到设计目标。
本文首先介绍了H.264编码标准的基本概念以及其相较于其它视频压缩标准的优点,并以DM6467为硬件核心,Linux 操作系统为软件开发平台依次从硬件、软件两个角度介绍了视频压缩系统平台的构建及功能的实现。