闫 军,代丰羽,王绍雷
(中国电子科技集团公司第三十四研究所,广西 桂林 541004)
近年来随着视频技术、网络技术以及终端处理技术的不断发展,人们对多媒体业务的需求呈现日益增长的趋势,据调查显示,目前网络视频数据量占据了整个互联网流量的90%,其中高清视频正在逐渐成为未来应用和发展的重点[1-3]。然而,在不断提升视频质量的同时也导致图像数据量呈现几何式的增长,这也使得视频编解码技术成为目前多媒体研究领域的热门技术之一。
目前,传统的视频编解码器由于性能的限制并不具备高清视频数据的处理能力[4,5],HI3531A是海思半导体针对多路D1和高清DVR、NVR产品应用开发推出的一款专业高端SOC芯片,具有高集成、高性能、多协议编解码和专用网络加速等优点,可轻松应对越来越高的高清应用和网络需求[6,7]。本文基于HI3531A芯片,结合H264视频压缩技术、嵌入式技术和网络技术,提出了网络高清视频编解码系统的设计方案。
高清视频编解码器同时具备编码、解码、传输、存储等功能,图1为该高清视频编解码器的硬件组成框图。
图1 高清视频编解码器硬件组成框图
各个模块的功能如表1所示。
表1 硬件模块功能表
编码模块的设计需要调用海思媒体处理函数库和Linux系统函数,完成编码器视频输入、编码、网络传输、本地回显等功能,软件设计的流程如图2所示。
图2 编码器软件设计流程图
在该处理流程中视频信号由输入设备(VI)接收进入输入通道,输入通道与视频前处理单元(VPSS)的通道组连接,在VPSS通道组中对视频信号进行去噪、缩放、锐化等统一预处理,形成多种不同分辨率的图像输出。输出的图像信号分别输送到两个方向:
一是经过输出(VO)通道传输给输出设备进行本地回显;二是经过编码(VENC)通道进入编码器进行视频编码,如图3所示。
编码模块的软件设计中涉及到三个关键线程,编码线程、数据发送线程和存储线程。其中,编码线程由码率控制器和编码器协同完成图像信号到码流的转换;数据发送线程对码流数据进行IP包封装(TCP/UDP数据包)和传输,采用嵌入式系统自带的socket套接字完成;存储线程完成码流数据的本地存储,可以按照自定义存储协议执行。三个线程之间相互协作,利用各自的缓存片区来完成整个编码、传输、存储过程,具体的流程如图4所示。
图3 视频信号处理过程
图4 编码器三线程协作图
解码模块同样由三个线程组成:一个主线程和两个子线程。主线程完成解码程序环境参数的配置并对整个解码过程进行控制;子线程1负责从网络中接收码流数据包;子线程2负责对码流数据包进行解码并将解码后的数据发送给输出设备。
在解码器的设计过程中采用“流式发送”的方式,每次将任意长度的码流发送给解码器,由解码器内部完成一帧码流的识别过程,这样可以降低因为不够一帧而出现解码错误的概率,从而加快解码的速度,提高解码的正确性。此外,本设计还将解码过程和网络接收功能独立开来,采用双线程处理的方式来避免码流数据的激增造成数据大量溢出,从而导致解码后图像质量下降的情况。
网络接收线程与视频解码线程之间采用环形缓存区的方式进行数据的交换。在环形缓存区中又分成若干个链表队列,每个队列可以存放数帧图像数据,该环形缓存区对数据交换的执行算法如下所述。
定义1.环形缓存区由链表数量、链表项、出链、入链组成,可表示为一个四元组:Z=(n,list,ar,aw),其中list=(id,len,mem)是链表项list的编号id,缓存数据长度len(len≤maximum)和缓存数据值mem,ar=(id,ex)是出链ar的编号id和动作ex,aw=(id,len)是入链aw的编号id和长度len。
定义2.如果环形缓存区Z的出链编号ar(id)等于入链编号aw(id),则出链动作ar(ex)停止,否则继续,即
Z:ar(id)=aw(id)→ar(ex)=false
ar(id)≠aw(id)→ar(ex)=true
定义3.如果出入链ar/aw的当前编号id等于list(n),则出入链的下一编号为list(1)。
图5 环形缓存数据交换图
假设当前环形缓存区在链表j,当前数据项为data(len,buf),其中len为数据长度,buf为数据缓存,则入链的执行过程如下:
init:aw(id)=j
aw(len)=0
whiletrue
ifaw(len)+data(len)≤maximum
copydata(buf)tolistj(mem)
aw(len)=aw(len)+data(len)
else
listj(len)=aw(len)
break
endif
假设当前环形缓存区在链表i,每次拷贝到网络包packet中的长度为length,则出链的执行过程如下:
init:ar(id)=i
ifaw(ex)=true
whiletrue
iflisti(len)>0
copylistj(mem)topacket
listj(len) =listj(len)-length
else
break
endif
为了测试编解码器的有效性、可靠性和实时性,首先搭建了视频编解码器的工作环境,通过设置配置文件中的各种运行参数,来测试在不同应用环境中编解码器的性能。本设计选取分辨率为1920*1080、1280*720的图像,以VGA和SDI作为输入,解码输出选取VGA和HDMI接口。
其次,为了测试存储日志的质量,系统还移植了FTP和WEB服务器,利用VLC进行远程播放。通过设置配置文件的的输出地址和网络协议,可以将编码后的码流传输给上位机,在PC端利用VLC播放软件直接进行解码输出。
为增加测试用例的难度,VGA输入接口的测试视频选取了运动性很强且背景复杂的MTV,测试结果如表2所示。
表2 测试结果
测试结果表明,该高清视频编解码器针对不同的场景,能够保证画面清晰流畅,实时性能良好,延迟在预定的范围内。
本文提出了一种网络高清视频编解码解决方案,能够对1080p/720p等高清分辨率的视频进行采集、编解码、存储、传输和播放,其具有实时性好,清晰度高,延迟低等优点,目前该设计方案已被应用到某设备的视频编解码存储矩阵中,运行效果良好。下一步希望能够在此基础上对视频流进行实时分析和远程传输,实现智能监控和远程播放的功能。