张修建,梁伟伟,王 兵,赵 茜,靳 硕
(1.北京航天计量测试技术研究所,北京 100076;2.华北计算技术研究所,北京 100083)
视频泛指将一系列静态影像以电信号方式加以捕捉、纪录、处理、储存、传送与重现的各种技术,随着通信技术的不断发展和网络带宽的快速增长,视频不断应用于各种传统及新兴行业中[1]。而视频信息自身具备的直观性和易被视觉接受的特点,使其不断引入航天、航空、无人机和机器人等需要实时监控的行业中,方便现场环境和作业对象的实时远程监控。
图像传输具有数据量大,实时性要求高的特点,尤其在无线传输中更容易受到外界环境的干扰,为了降低传输过程中的误码率,提高传输链路的可靠性,设计了一种基于HDLC协议的传输链路。高速通信协议HDLC 是一个在同步网上传输数据、面向比特的数据链路控制协议。它具有差错检测功能强大、实时和同步传输、可靠性高等特点[2]。
为了在图像传输过程中降低误码率,并且保证其实时性,本文着重设计了符合项目要求的编码模式、压缩算法和发送协议,实现了视频压缩装置的开发和实现。
视频压缩传输装置的原理如图1中所示,主要分为硬件设计和软件设计。软件是视频压缩装置实现实时压缩和码流平稳传输的核心,在支持视频采集的硬件电路上,设计了视频采集、H.264编码、码流封装和HDLC发送等模块,各功能模块在DSP/BIOS调度机制的作用下统一协作,共同实现视频的实时压缩和码流的平稳传输功能。
视频压缩装置的硬件是基于数字信号处理器(DSP)和可编程门阵列(FPGA)进行设计的,图2为视频压缩装置硬件结构图。DSP主要完成复合视频解码器的初始化、视频参数设置和视频的实时压缩; FPGA主要完成时序控制、通信协议实现和码流等数据的传输;整机工作时可同时最多接入4路视频信号的采集。
图2 视频压缩传输装置硬件结构图
软件设计是整个装置实现视频实时压缩和码流HDLC传输的核心,采用C语言和汇编语言设计完成,主要运行在DSP内,实现视频采集、H.264编码、码流封装和HDLC发送等功能,在FPGA的进一步时序配合下,完成数据到下级控制器的传输。
参照图1可以看出,视频压缩装置接收摄像头输出的PAL制模拟视频信号,在DSP内的视频采集功能模块的控制下, 调用复合视频解码器将视频信号解码成复合ITU-R 656格式的视频信号;同时通过预置参数的作用,保证捕获到的图像特征如大小、帧场模式等,符合后端压缩编码器的输入图像信号要求。
在视频采集的设计上,采用实时操作系统DSP/BIOS提供的FVID类驱动模型实现。FVID模型主要由FVID_create、FVID_control、FVID_alloc、 FVID_exchange和FVID_delete函数构成,提供模块化的读写应用函数,可以更加友好、高效地实现视频抓取和视频存储空间的分配,通过简单的应用程序调用,即可轻松实现视频的循环采集。图3显示的是单帧图像的采集过程。
图3 单帧图像的采集原理
采集参数设置是通过参考并设计FVID类驱动模型中的FVID_frame和VPORTCAP_Params结构体实现的,FVID_frame结构体中主要包含的是YUV图像信号格式的亮度和色度信息,VPORTCAP_Params结构体包含了捕获的视频信号的详细信息,如行数、列数、YUV结构、场频、捕获模式设置、水平视频数据是否放缩、水平色度数据滤波、奇偶场列的开始和结束位置、FIFO的门限值等信息。设备驱动根据配置参数计算缓冲区的大小并分配缓冲区,且至少要为每个FVID通道分配3个缓冲区,以确保视频图像的捕获和显示的连续性。视频捕获前,须正确设置VPORTCAP_Params结构体中的相关参数,以保证获取符合任务要求的视频信号。
图像采集的具体过程由FVID模型中的相关函数实现。其中,FVID_create函数建立一个FVID通道对象并初始化,FVID_control函数发送控制命令配置复合解码器和采集视频数据,FVID_alloc函数申请采集空间, FVID_exchange函数通过交换空间采集新的一帧图像。
视频压缩装置的编码器采用H.264标准设计,作为新一代压缩标准的H.264,相比以前的标准(如MPEG-4、H.263等),在保证相同图像质量的前提下,可以节约50%的码率,而且对网络传输表现出更好的适应性[3],是当下主流的视频编码标准。
H.264采用混合编码技术,在整数DCT变换、可变大小的多模式宏块、环路滤波、运动补偿、高效的运动估计算法等方面引入新技术,通过每个模块的小的技术改进,带来了系统整体性能的提升,使运动图像压缩技术上升到了一个更高的阶段。本本采取编码器结构优化和压缩算法优化等技术途径,保证压缩的实时性和正确性。
2.2.1 编码器结构设计
视频压缩装置的编码器采用混合编码框架设计,提供了输入图像的宽高、关键帧的间隔、码率和帧率等控制参数,编码器参数结构定义如下:
typedef struct
{
unsigned int nWidth; //图象的宽
unsigned int nHeight; //图象的高
unsigned int nIFrame; // 关键帧的间隔
int bDeblockingFilter; //环路滤波的标志
unsigned int nQualityCtrlMode; //质量模式
unsigned int nQP;//量化参数的设置 0-51
unsigned int nFPS;//帧率(frame/s)
unsigned int nBitRate;//码率(bit/s)
unsigned int nFlag;//5bit编码标志位
} YTH264PARAM;
图4 视频编码器结构图
2.2.2 压缩算法设计
视频压缩装置的多处包含决定编码功能和效率的复杂算法。本文只对关键算法进行简单介绍。帧内预测用来清除空间冗余,帧间预测用来清除时间冗余,变换和量化用来消除频率冗余,环路滤波用于消除量化噪声。
帧内预测算法充分利用图像的空间相关性, 利用图像块周围的像素来进行帧内预测, 提高了编码效率, 从而减少编码输出的码率。H.264视频编码标准在帧间预测模式中增加了很多关键技术来提升压缩性能,在此不再赘述。
为了进一步节省图像传输码率,需要对图像信号进行压缩,一般采用变换编码来消处图像信号中的相关性及减少图像编码的动态范围。变换编码将图像时域信号通过数学工具变换成频域信号,在频域中,图像信号能量重新分布,且能量大多集中在低频区,相对时域信号,码率会有较大下降。根据统计和经验得知,平坦区域或内容缓慢变化区域占据一幅图像的绝大部分,而细节区域或内容突变区域则占小部分。这样,空间域的图像变换到频域,即所谓的变换域,会产出相关性很小的一些变换系数,并可对其进行压缩编码。视频编码中变换编码的数据源,包括两种:一是图像数据本身,二是图像残差。H.264 把运动估值和帧内预测的残差结果从时域变换到频域,使用了类似于4x4 离散余弦变换 DCT(Discrete Cosine Transform)的整数变换,而不是采用8x8 DCT的浮点数变换。这种方法的优点在于:在编码器和解码器中允许精度相同的变换和反变换,便于使用简单的定点运算方式。在 H.264 中,同时采用整数运算,提高图像压缩的实时性[5]。
量化编码是把DCT系数除以一个常量,经过量化后的结果是量化步长的整数倍或为更多的零值,从而达到了压缩的目的。在反量化时,由于量化过程取整或四舍五入,而无法完全恢复原DCT系数,从而产生一定的失真。量化的原理公式如公式1所示,反量化的原理公式如公式2所示。由于一般的可编程平台没有提供专用的除法指令,所以视频编码标准在量化与反量化的实际应用过程中,采用了查表或移位的方式来实现,量化步长越小,等级越多,则码流大小等级越丰富。
公式1
F'(x,y)=q(x,y)*Q
公式2
另外,H.264中的Deblocking Filter还能够根据图像内容做出判断,对由于块效应产生的像素值跳变进行平滑,对每个 4×4 块边界都要进行滤波操作,以此达到平滑滤波边界的目的。这样可以消除经过反量化和变换后,重建图像中由于预测误差产生的块效应,即块边缘处的像素值跳变,从而一来改善图像的主观质量,二来减少预测误差。
2.2.3 码率控制设计
码率控制算法一般是通过调整DCT变换系数的量化参数,来实现达到控制输出码流速率的目的。在本文设计的H.264视频编码中,我们的码率控制算法主要在GOP层、Frame层以及基本单元层3个层次上进行。
GOP层码率控制的主要任务是根据当前的比特率、帧率、缓存区充满度、传输速度以及GOP帧数、帧类型来计算每个GOP的目标比特数,并且得到各个GOP的初始量化参数。其中当前GOP目标比特根据网络带宽,帧频以及GOP中帧的数目分配。
Frame层控制的主要任务是根据已编码帧实际消耗的比特数和GOP层计算得到的目标比特数,将前两者比特数的差值反应到当前帧的目标比特数,对当前帧的目标比特数进行调整,以便调整该帧的量化参数。具体可分为两步:第一步是考虑缓存容量限制,第二步熬了网络带宽、帧频、GOP中剩余可分配的比特等限制。
基本单元一般是指一帧或者一个宏块。若基本单元层是一帧,那么该层码率控制的主要任务就是根据当前帧的目标比特数对该帧的量化参数进行调整。若基本单位层是宏块,那么该层码率控制的主要任务就是在该帧目标比特数确定的前提下,根据每个宏块的图像复杂度,进一步调整该宏块的量化参数。同时,为了满足视觉的平滑性,要保证该基本单元层的量化参数和前一个基本单元层量化参数的差值不能太大。一般来说,选择的基本单元越大,获得的PSNR越大,但是比特输出的波动也会变大。反之,选择的基本单元越小,比特输出相对平稳,但是获得的PSNR将会变小。
本软件采用多任务系统,采用DSP/BIOS线程调度机制进行任务的管理[6],设计多个线程同时运行,如图5所示,每个线程有独立的指令流,完成一个独立的功能模块,允许优先级高的线程抢占优先级低的线程,线程间可通信和同步处理,通过环形缓冲区进行数据的访问和存取。
图5 多线程运行原理图
在此线程中,基于图4的视频采集原理,设计了可同时采集4路输入视频的采集架构。基于产品化设计要求,对于每一路视频进行灵活控制,可直接压缩编码,也可以根据CPU分配的时间片,在特定的时间片内进行压缩编码。根据使用需求,设计了两种视频压缩模式:单路切换监控模式和4路并行监控模式。在实际工作应用场景中,可灵活配置视频压缩装置的视频监控路数和单路的视频监控时间。
送入编码器的视频经压缩处理后形成H.264码流,在标准的H.264码流头部加入特殊的识别标志、序列号、码流大小等关键信息进行封装,形成具有独特识别标识的码流,保证码流在传输过程中的安全,方便解码软件的分析和播放。H.264码流暂存环形缓冲区中,等待后续的发送和HDLC传输。
当DSP/BIOS运行发送线程时,暂存环形缓冲区中的H.264码流按包发送并进行HDLC传输,单包的数据量过大,积累的码流数据量过多,解码出来的图像卡顿;单包的数据量过小,每次接收到的码流数据量少,会导致解码的图像花屏,因此,在理想情况下,每帧图像压缩形成的码流,需要及时地传输到解码端进行解码播放,才能保证视频播放的连续性。
为了HDLC同步传输的连续性,在不发送H.264码流的空隙时间段内,循环发送4个字节的无效数据,提高了视频压缩装置的整体数据发送速率,并把无效数据重复有效数据的概率降低到2×10-10数量级,避免了有效数据在解码端的错误丢弃,保证了视频的质量和流畅播放。
在主程序中,视频编码线程与码流发送是两个独立的线程,它们之间的数据共享是通过环形缓冲区来完成的。由于是长时间运行,通常对内存的使用有很高的要求,分配频繁,释放内存容易产生内存碎片,必然会影响软件长期运行的稳定性,在这种情况下,使用像动态环形队列这种内存性能比较好的数据结构就非常合适[7]。用环形队列的缓冲区,解决多个线程同时读写缓冲区的问题,同时根据数据的重要性可选择添加互斥访问保护机制。一般来讲,队列FIFO,从底部添加数据,从顶部弹出数据。添加新元素的那一端被称作队尾nTail,而弹出元素的那一端被称作队首nHead。环形队列的特点是:不需要进行动态的内存释放和分配,使用固定大小的内存空间反复使用。在实际的队列插入和弹出操作中,是不断交叉进行的,当push操作时,tail会增加,而当pop操作时,head会增加。
1)如果push的速度快的时候,有可能追上head,这个时候说明队列已经满了,不能再进行push的操作了,需要等待pop操作腾出队列的空间。
2)如果pop的操作快的时候,使得head追上tail,这个时候说明队列已空了,不能再进行pop操作了,需要等待
push进来数据。
本文以该技术背景为前提给合在航天领域视频监测的应用,探索并实现了基于HDLC协议的图像实时压缩传输系统设计。视频采集与编码线程和码流发送线程之间的数据共享通过对环形缓冲区来完成的,视频采集与编码线程输出码流到环形缓冲区中,在DSP/BIOS线程调度机制下,码流发送线程从缓冲区中取出一定字节大小的码流进行发送,按照HDLC传输协议送至通信链路中,然后通过UDP协议送入主机进行解码播放。
在实际测试环境下,输入视频的分辨率为352*288,视频压缩传输装置以25帧/s的实时速率压缩编码,以512kbps的码率宽带输出码流,经过中转后送入主机实时解码播放。通过对帧头时间标签的计算得出压缩与处理环节的平均总延时为170ms,4路视频的平均切换时间为65ms;采用ITU-T提供的测试序列,计算得出重建图像序列平均峰值信噪比PSNR值为37.83dB;连续运行5小时内无图像丢帧,并能够准确的表达剧烈突变的运动,达到了预期的设计目的和控制效果。
[1] 张纪宽,彭 力,陈志勇.动态复杂背景下的智能视频监控系统设计与实现[J].计算机测量与控制, 2016, 24(7):100-104.
[2] 张文博,左 勇,徐浩然.支持HDLC协议的紫外通信系统设计[J].光通信技术,2012,36(9):53-56.
[3] 金艳梅.高速视频会议系统H.264编码的优化[J].兰州理工大学学报,2015,41(3):108-111.
[4] 柳 春,廉东本.H.264编解码算法在视频会议中的应用[J].计算机系统应用,2015,24(4):144-147.
[5] 安向阳,沈庭芝. 基于DSPTMS320DM642的H.264视频编码的实现和优化[J]. 微计算机信息, 2005(20):128-130.
[6] 彭启琮,管 庆.DSP集成开发环境——CCS及DSP/BIOS的原理与应用[M]. 北京:电子工业出版社,2004.
[7] 詹 英,吴春明,王宝军.基于RCSW的数据流速度异常检测算法研究[J].电子学报,2012,40(4):674-680.