基于Hi3531A芯片和流媒体服务器的视频监控系统

2018-02-28 10:53曾永安康韦晓单亚飞敦科翔
无线电通信技术 2018年2期
关键词:线程客户端编码

曾永安,康韦晓,单亚飞,敦科翔

(1.国网江西省电力公司抚州供电分公司,江西 抚州 344000; 2.河北远东通信系统工程有限公司,河北 石家庄050002)

0 引言

视频监控系统发展了短短二十几年时间,从19世代80年代的模拟监控到火热的数字监控再到方兴未艾的网络视频监控,发生了翻天覆地的变化[1]。从技术角度出发,视频监控系统发展划分为:第一代模拟视频监控系统;第二代基于“PC+多媒体卡”数字视频监控系统;第三代完全基于IP网络视频监控系统[2]。全IP视频监控系统[3]有如下的优势:① 简便性——所有摄像机都通过经济高效的有线或者无线以太网简单连接到网络,使您能够利用现有局域网基础设施;② 强大中心控制——一台工业标准服务器和一套控制管理应用软件就可运行整个监控系统;③ 易于升级与全面可扩展性——轻松添加更多摄像机,将来中心服务器亦能够方便升级到更快速处理器、更大容量磁盘驱动器以及更大带宽等;④ 全面远程监视——任何经授权客户机都可直接访问任意摄像机;⑤ 坚固冗余存储器——可同时利用SCSI、RAID以及磁带备份存储技术永久保护监视图像不受硬盘驱动器故障影响[4]。

现在的视频监控系统正朝着高清化、集成化和智能化的方向发展。华为海思的海思芯片Hi3531A,内置ARM A9双核处理器和高性能的H.264视频编解码引擎,集成了包含多项复杂图像处理算法的高性能视频/图像处理引擎,能够提供HDMI/VGA高清显示输出能力。因此,本文提出了一种基于Hi3531A芯片和流媒体服务器的视频监控系统。

1 系统总体设计

本系统主要分3部分:编解码器模块、流媒体服务器模块和客户端模块。编解码器模块以Hi3531A芯片为核心主要用来完成视频采集和视频编码的任务;流媒体服务器模块在EasyDarwin[5]流媒体的基础上增加录像部分主要用来接收编解码器发送的视频流并保存和转发;客户端模块主要是利用libvlc.dll动态库编码来显示实时视频。流媒体服务器支持RTP/RTCP/RTSP协议,编解码器、客户端和流媒体之间都通过此协议来进行通信。系统的总设计图如图1所示。

图1 系统总设计

2 编解码器模块

编解码器采用HI3531A芯片[6],集成多项复杂图像处理算法的高性能视频/图像处理引擎,提供HDMI/VGA高清显示输出能力。编解码能力为8x1080p@30fps H.264编码+8xCIF@30fps H.264编码+4x1080p@30fps H.264解码+8x1080p@2fps JPEG编码。

编解码器的工作原理:

① 视频输入单元通过 ITU-R BT.601/656 接口接收由 VADC 输出的数字视频信息,并通过 AHB 总线把接收到的原始图像写入到外存(SDR SDRAM 或 DDR SDRAM)中;

② 视频编解码器从外存中读取图像,进行运动估计(帧间预测)、帧内预测、DCT 变换、量化、熵编码DCT 变换、反量化及运动补偿等操作,最后将符合 H.264 协议的裸码流和编码重构帧写入到外存中;

③ 视频输出单元从外存中读取图像数据并通过 ITU-R BT.601/656接口送给 VDAC 进行显示,应用的需求不同,视频输出单元从外存中读取的图像内容也不同,当需要对输入图像进行预览时,视频输出单元从外存中读取原始图像,当需要观察视频编码器的编码效果时,视频输出单元从外存中读取编码重构帧;

④ ARM 对视频编码器输出的码流进行协议栈的封装,然后送给网口发送。

编解码器的工作流程主要分为MPP媒体处理和RTP/RTCP封装和拆解。

2.1 MPP媒体处理

海思提供的媒体处理软件平台(Media Process Platform,MPP),可支持应用软件快速开发。该平台对应用软件屏蔽了芯片相关的复杂的底层处理,并对应用软件直接提供MPI(MPPPrograme Interface)接口完成相应功能。

海思媒体处理平台的主要内部处理流程如图2所示,主要分为视频输入(VI)、视频处理(VPSS)、视频编码(VENC)、视频解码(VDEC)、视频输出(VO)、音频输入(AI)、音频输出(AO)、音频编码(AENC)、音频解码(ADEC)以及区域管理(REGION)等模块。

图2 MPP工作原理

2.2 RTP/RTCP封装和拆解

本设计采用ARICENT公司的RTP/RTCP协议栈,RTP/RTCP协议栈的接口以API和回调函数的形式存在。

当视频帧较大时,需要将一帧图像拆成多个RTP进行传递,具体分包规则按照RFC3984标准进行。视频的RTP处理流程如图3所示。

图3 RTP处理流程

3 流媒体服务器模块

流媒体服务器模块是基于开源EasyDarwin流媒体软件框架进行开发的[7]。EasyDarwin是由国内开源流媒体团队维护和迭代的一整套开源流媒体视频平台框架[8],从2012年12月创建并发展至今,开辟了诸多的优质开源项目,能更好地帮助广大流媒体开发者和创业型企业快速构建流媒体服务平台,更快、更简单地实现最新的移动互联网(安卓、iOS、H5、微信)流媒体直播与点播的需求,尤其是安防行业与互联网行业的衔接[9]。它的RTSP开源流媒体直播服务,高效、稳定、可靠、功能齐全,支持RTSP流媒体协议,支持安防行业需要的摄像机流媒体转发功能、支持互联网行业需要的多平台(PC、Android、IOS)RTSP直播(H.264/MJPEG/MPEG4、AAC/PCMA/PCMU/G726)功能,底层(Select/Epoll网络模型、无锁队列调度)和上层(RESTful接口、WEB管理、多平台编译)、远程运维等方面优化,这些都是全代码完全开源的[10]。

它的核心部分是由一个父进程所fork出的一个子进程构成,该父进程就构成了整个流媒体服务器[11]。父进程会等待子进程的退出,如果在运行的时候子进程产生了错误从而退出,那么父进程就会fork出一个新的子进程。可以看出,网络客户和服务器直接的对接是由核心服务器来完成的。网络客户RTSPoverRTP来发送或者接受请求。服务器就通过模块来处理相应的请求并向客户端发送数据包。核心流媒体服务通过创建4种类型的线程来完成自己的工作[12],具体如下:

① 服务器自己拥有的主线程。当服务器需要关闭检查,以及在关闭之前记录相关状态、打印相关统计信息时,一般都是通过这个线程来完成的。

② 空闲任务线程。这个任务线程是用来对一个周期任务队列的管理,主要管理2种任务,即超时任务和Socket任务。

③ 事件线程。套接口相关事件由事件线程负责监听,当有RTSP请求或者收到RTP数据包时,事件线程就会把这些实践交给任务线程来处理。

④ 任务线程。任务线程会把事件从事件线程中取出,并把处理请求传递到对应的服务器模块进行处理,比如把数据包发送给客户端的模块,在默认情况下,核心服务器会为每个处理器核创建一个任务线程。

本文在此基础上增加了保存录像功能,主要原理是在主线程接受到编解码器推送来的视频流后自动开启一个RTSP客户端线程;客户端和服务器之间的连接是基于RTP/RTCP/RTSP协议,此线程在接收到视频流后,按帧打包,再调用libmp4v2.dll来将H.264视频流保存成MP4格式。在系统中MP4文件大小设计为每到整点和30分时自动保存一次,同时为了保障服务在服务异常断开使MP4文件损坏时,仍然能够得到有用的视频信息,会同时生成一个H.264文件。当MP4文件保存正常时,对应H.264文件会删除,否则会保存H.264文件。在大量的试验中发现只有机器异常断电时,由于程序不能正常退出会造成MP4文件不完整无法播放,而H.264文件是由纯粹加了头的sps、pps和帧数据组成,不会被损坏。本系统选择MP4格式的原因是它几乎能被所有播放器识别,方便用户使用,而H.264文件只能被极少数播放器播放(例如,VLC播放器正常模式不能播放H.264文件,但选择“工具—首选项—(左下)全部—输入/编解码器中的去复用器—选择H.264去复用器—确定”就可以播放H.264文件了),因此只作为特殊情况的备用项。图4为流媒体服务器模块的主要框架图。

图4 流媒体服务器框架

流媒体服务器在运行时,接受流和发送流都是通过RTSP协议来进行,它们之间的流程如图5所示。

图5 RTSP流程

C表示rtsp客户端,S表示rtsp服务端。

① C→S: ANNOUNCE request ∥提交媒体初始化描述信息(SDP)给S;

S→C: ANNOUNCE response ∥ S回应该提交的信息;

② C→S:SETUP request ∥设置会话的属性,以及传输模式,提醒S建立会话;

S→C:SETUP response ∥S建立会话,返回会话标识符,以及会话相关信息;

③ C→S:RECORD request ∥C请求录像;

S→C: RECORD response ∥S回应该请求的信息;

④ C→S: PLAY request ∥C请求播放(拉);

S→C: PLAY response ∥回应请求(拉);

⑤ C→S:发送流媒体数据(推模式;);

S→C:接受流媒体数据(拉模式);

⑥ C→S:TEARDOWN request ∥C请求关闭会话;

S→C:TEARDOWN response ∥S回应该请求。

4 客户端模块

如图6所示,客户端模块是在Windows平台上运行的一个实时视频播放程序,采用VC++开发,与流媒体服务器模块之间通过RTP/RTCP/RTSP协议连接,主要通过调用libvlc.dll库来实现[13]。

图6 RTSP流程

本系统支持多个客户端接入,通告配置流媒体服务器IP地址,客户端可在任意Windows电脑播放监控视频。系统研制过程中解决因缓存小而出现的播放高清视频录像时的半屏现象。原因是libvlc.dll接受视频帧缓存初始值比较小,当存储1080P高清视频时,I帧数据超过缓存大小,系统先丢掉多余数据后再将缓存翻倍,这样视频的前几秒会出现半屏现象。改进方法是在接受数据时判断帧大小,根据需要设置缓存大小,同时重新设置缓存初始值,重新编译libvlc.dll,解决了播放高清视频时的短暂半屏的问题。

5 结束语

本系统设计的视频监控系统经过测试能够播放和保存1080P、720P、4CIF、VGA、CIF以及QCIF等6种分辨率的视频,并且客户端播放实时监控视频延时小于1 s,满足绝大部分使用要求。本系统特地制作了分屏模式,能够将4个视频制作成一个视频实现分屏播放,经测试视频播放流畅,系统稳定。此方案不仅可以部署在交通道路、商场、银行等固定场所使用,也可以作为公安应急、森林防护以及部队演习等野外作业的现场与中心通信的临时指挥系统来使用。

[1] 钟辰.平安城市网络视频监控组网解决方案以及发展趋势研究[D].南京: 南京邮电大学,2015.

[2] 陈浩鑫.城市治安视频监控系统设计与实现[D].长沙:湖南大学,2014.

[3] 古前疆.基于IP网络的视频监控系统的设计与实现[D].大连: 大连理工大学,2013.

[4] 王亚沛.面向智慧社区的智能视频监控系统设计与应用研究[D].杭州:浙江理工大学,2015.

[5] 潘明.基于H.264的网络视频监控系统的研究与实现[D].长春: 吉林大学,2014.

[6] 郑阳.基于Hi3516A处理器的KVM终端软件设计[D].杭州: 浙江工业大学,2016.

[7] 高春雷.视频直播系统设计与实现[J].科技风,2016(18): 103.

[8] 文力.基于Android和云平台的幼教系统的设计与实现[D].武汉: 华中师范大学,2016.

[9] 向华.流媒体服务系统核心技术的研究与实现[D].西安:西安电子科技大学,2014.

[10] 陈广东.流媒体服务器集群负载均衡算法研究[D].武汉: 华中师范大学,2006.

[11] 林洪艺.流媒体组播服务器的构建及软件开发[D].厦门: 厦门大学,2008.

[12] 张洪宇.基于RTP协议流媒体服务器的研究[D].成都:电子科技大学,2007.

[13] 冀龙涛.基于Android手机的家用机器人控制技术研究[D].哈尔滨: 哈尔滨工业大学,2013.

猜你喜欢
线程客户端编码
基于C#线程实验探究
基于SAR-SIFT和快速稀疏编码的合成孔径雷达图像配准
《全元诗》未编码疑难字考辨十五则
子带编码在图像压缩编码中的应用
基于国产化环境的线程池模型研究与实现
线程池调度对服务器性能影响的研究*
如何看待传统媒体新闻客户端的“断舍离”?
Genome and healthcare
县级台在突发事件报道中如何应用手机客户端
孵化垂直频道:新闻客户端新策略