B/S架构嵌入式视频监控系统客户端设计
2013-09-17吴金策杜劲松
吴金策,杜劲松
(1.中国科学院研究生院,北京 100049;2.中国科学院沈阳自动化研究所,辽宁沈阳 110016)
B/S架构嵌入式视频监控系统客户端设计
吴金策1,2,杜劲松2
(1.中国科学院研究生院,北京 100049;2.中国科学院沈阳自动化研究所,辽宁沈阳 110016)
主要阐述基于B/S架构的嵌入式网络视频监控客户端的设计与实现,重点介绍了按RTP协议封装的H.264视频数据接收过程中缓冲机制的实现以及基于FFmpeg和SDL的视频解码与显示。对B/S结构中ActiveX控件在视频监控客户端中的应用也做了一些介绍。实验结果表明,该客户端能够通过浏览器对监控现场进行监控,且具有使用方便等特点,适合用于远程监控。
B/S;RTP;缓冲区;FFmpeg;SDL;ActiveX
随着计算机技术、网络技术、视频压缩编码技术等关键技术的飞速发展,特别是宽带网络的迅速普及,网络视频的实时传输成为网络应用的热点之一。目前,视频传输技术正迅速被应用于视频会议、IP可视电话、Internet远程教育、医疗监控等领域。
嵌入式系统是以应用为中心,软硬件可裁减的专用计算机系统。它主要由嵌入式微处理器、相关支撑硬件、嵌入式操作系统及应用软件等组成。传统的视频监控系统是应用现有的计算机技术,系统庞大,软硬件资源得不到充分利用而嵌入技术的应用能使监控系统小型化,更能集中各种所需功能[1]。与PC的视频监控系统相比,嵌入式监控系统具有成本低、耗电少、实时性好、易于升级与扩展等优点,具有良好的应用前景,在视频监控中也得到了快速的发展。
B/S(Browser/Server)体系结构利用网络浏览器,结合脚本语言和ActiveX技术,实现了许多以前专用软件才可以完成的复杂功能。这种方式节约了开发成本,在服务器端系统安装和维护便可解决,是一种全新的软件体系结构[2]。本文主要探讨一种B/S架构的嵌入式视频监控系统,着重介绍客户端中为RTP数据丢包乱序问题而设计的缓冲机制以及FFmpeg解码、SDL显示等关键技术。
1 系统总体架构
整个网络视频监控系统主要用于远程监控,利用现有的IP网络,满足授权用户远程观看监控现场视频画面的需求。系统由监控点前端设备、传输网络和客户端播放控制终端等部分组成。
图1是整个监控系统结构图,在此系统结构中,服务器由Web服务器和视频服务器两部分组成。通过Web服务器,客户端获得包含视频播放控件的Web页面作为操作界面。视频服务器则负责从摄像头采集视频图像数据,对图像进行编码、压缩及发送。嵌入在客户端浏览器中的视频播放控件负责接收、解码和播放视频图像。在此结构中,视频图像数据在服务器和客户端之间不再通过HTTP协议进行发送,而是采用适合流媒体数据传送的RTP/RTCP协议,这样的方式减小了数据传输的时延,也减轻了Web服务器的负担。
整个系统工作流程如下:
1)服务器上电启动后,自动启动Web服务器和视频服务器程序。
2)用户通过Web浏览器请求监控页面,Web服务器模块接收到请求后,首先通过CGI程序验证用户身份。对合法用户的请求,返回包含视频播放ActiveX控件的Web页面给浏览器。
图1 视频监控系统结构图
3)用户在客户端的播放控件中选择开始监控,命令被发送到视频服务器模块的监听端口。视频服务器模块启动视频采集,对采集到的图像进行压缩编码,通过RTP协议将图像发送到客户端的指定端口。
4)客户端播放控件模块接收服务器传过来的RTP数据包,进行解码并显示。
2 客户端设计
客户端主要是结构图中视频播放ActiveX控件部分。控件分为RTP数据包接收、FFmpeg解码及SDL库显示三部分。
2.1 图像接收缓冲机制实现
为了保证传输的实时性,视频流媒体的实时传输在传输层都采用UDP协议,而放弃了有差错检验和错误重传机制的TCP协议[3]。虽然在应用层可以采用RTP/RTCP协议提供一定的保证,但在传输层上丢包乱序的情况仍然无法避免,所以应用程序必须采用必要的策略对丢包和乱序数据进行处理。如果对乱序数据直接交给下游的解码器处理,解码后图像严重失真[4]。为解决这个问题,在数据递交给解码器之前缓冲一定数量的数据包,完成对数据包重新排序,以达到平滑播放的效果。
视频传输模块按照RTP协议打包并发送到客户端。由于一个H.264编码器输出单元NALU可能较大,封装成RTP数据包时,如果数据包长度超过了网络中的最大传输单元(MTU),就会被拆分成多个分片进行传输[5]。RTP协议下层使用UDP协议,而UDP协议是不保证传输质量的,如果被拆分的包中某个分片由于网络拥塞而出现了丢失,接收方便无法重组UDP数据报,从而导致整个RTP包被丢弃。因此,需要将RTP包的长度控制在网络的MTU允许的范围以内。MTU通常为1 500 byte,除去RTP数据报和UDP数据报首部,NALU最好控制在1 400 byte左右。这样,当需要发送的NALU大小超过了1 400 byte时,先将这帧图像数据切割成若干段,然后按照协议RFC3984,将每一段封装成一个RTP数据包进行发送,一帧图像就被分成多个RTP包进行传输。
为了使接收端在接收到RTP包后能够重组,必须知道哪些RTP包中的数据属于同一个NALU。这可以通过设置RTP协议中的时间戳字段来实现,将同一个NALU的所有RTP包的时间戳设为一致,不同NALU的时间戳设为不同。此外,由于RTP包到达接收端的顺序有可能与发送的顺序不同,还需要在RTP数据包中利用序号字段来对发送的顺序进行标识。图2为RTP协议头部示意图[6]。
图2 RTP头部示意图
其中重要字段有:
1)标志(M):1 byte,用来允许在比特流中标记重要的事件,在本文组包过程表示一个NALU拆分最后的RTP包。
2)负载类型(PT):7 byte,定义了负载的格式。
3)序列号(sequence number):16 byte,每发送一个RTP数据包,序列号加1,接收端可以据此检测丢包和重建包序列。
4)时间戳(timestamp):32 byte,时间戳反映了RTP数据包中第一个字节的采样时间,可以用作区分不同NALU的依据。
2.1.1 图像缓冲实现
图像缓冲采用两级策略,一级为RTP数据包缓冲,二级为NALU组合。接收到的数据先经一级缓冲队列按时间戳和序列号进行重排序,其输出结果送入下级进行NALU组合,输出为完整的NALU,然后送给解码单元。NALU组合流程图如图3所示。缓冲区工作原理图如图4所示。
RTP头部中时间戳字段表示图像采样时间,由同一NALU拆分得到的RTP包时间戳相同,因而可以用来区分不同NALU。序列号字段表示RTP包发送顺序,每发送一个包,序列号值增加1。依靠RTP头部中的时间戳和序列号字段,可以判断接收的RTP包是否属于同一个NALU,并对其排序。
由于缓冲过程需要频繁插入与修改,而链表结构实现这些操作较为简单高效,采用链表来缓存数据包并排序。为避免缓冲过程中内存的频繁分配和释放,最开始便对工作链表进行初始化,为每个链表分配了一定数量的节点,其中设置了1个空闲链表和4个组帧链表,输出链表在解码完成后设置结构体中相应域成为空闲链表,循环交替,任一时刻都有4个不同时间戳对应链表进行缓冲。
链表的元素定义为一个rtp_packet结构体,其定义如下:
每接收到一个RTP包,首先判断其是否属于正在工作的4个NALU链表,具体可以分为以下3种情形:
1)时间戳小于当前正在工作的几个链表时间戳最小值,则该包已经超时,可以将其丢弃,开始接收下一个RTP包。
2)时间戳等于正在工作的某个链表对应时间戳,则遍历对应链表,从中取一个节点修改各字段值并将该节点插入到该链表中。若没有空闲节点,则为其分配一个,保存该RTP包信息并将其接入到链表。
3)时间戳晚于当前正在工作链表的时间戳,说明是新的一个NALU到达。输出时间戳最小对应链表,将该包信息保存到空闲链表。
2.1.2 图像缓冲丢包策略
在解码中为了防止误差扩散,发送端编码器会间隔一定的帧数发送关键帧(IDR),以控制编码和解码流程。IDR帧的作用是立刻刷新参考帧列表(DPB),重新编码一个新的序列,使错误不致传播[7]。对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容。从随机存取的视频流中,永远可以从一个IDR播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有IDR的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。
上一级缓冲以接收到的RTP数据包为单位,其输出为同一时间戳的数据包,需要下一级缓冲进行重组,将拆分的数据包重新组合成完整的NALU,然后把NALU给解码器处理。在一个视频序列中,假设某帧Frame[i]不正确,这时如果对此帧解码,就会错误解码。如果Frame[i]为参考帧,解码器在解码Frame[i+1]的时候就会以Frame[i-1]作为参考帧解码。显然,这种错误解码会导致图像质量下降,严重影响视频效果。所以,在缓冲区要根据帧类型制定合理的丢包策略。
在经过一级RTP缓冲后,有部分数据包还未到达,其输出数据还有可能不完整,接收到数据包后应该判断序列号是否连续,即是否存在丢包。如果存在丢包,则丢弃该包,直接检测到下一个IDR出现。一个IDR由三部分组成,包括SPS序列参数集、PPS图像参数集、I帧图像,可以通过对NALU头部特定字段进行检查来判别。
下面是丢包组帧策略实现过程:
1)对接收数据包类型进行判断,检查是否为SPS序列参数集、PPS图像参数集、I帧图像。
2)开始组包,通过判断RTP包头部类型,结束标志,以及序列号是否连续进行组包。若检测到序列号不连续即丢包现象,则停止组包,直到接收到下一个关键帧再重新开始接收并组包,然后传递给下级解码单元。
2.2 图像解码显示
图像解码流程如图5所示。
图5 解码流程图
FFmpeg是一个集录制、转换、音/视频编解码功能为一体的完整的开源免费解决方案。FFmpeg的开发是基于Linux操作系统,但可以在大多数操作系统中编译和运行。它采用了主程序+核心库的编程模式,核心库隐藏了其内部各种的具体格式的实现,对外提供了统一的调用方法[8]。解码时FFmpeg主要调用 av_register_all(),avcodec_alloc_frame(),avcodec_find_decoder()等函数来完成。解码时主要涉及 FFmpeg下的avcodec库、swscale库,其中第一个库是一个包含了所有FFmpeg音视频解码器的各种函数,第二个库是格式转化库,利用该库可把YUV420格式转化成计算机上显示所需的RGB格式。
SDL(Simple Directmedia Layer)是一个自由的跨平台的多媒体开发包,具有简单易用、高性能和跨平台的优点,被广泛应用于各种操作系统中[9]。视频显示主要是通过对overlay数据结构赋值来完成显示。FFmpeg解码输出为YUV420格式的数据,为避免YUV到RGB格式的转换,可以直接利用overlay显示。视频显示程序主要包括SDL初始化、创建display_surface、创建overlay、锁定overlay、处理视频图像数据、解锁 overlay、显示图像、关闭退出。
2.3 ActiveX控件及其在Web中的实现
ActiveX是一组使用COM(组件对象模型)来实现功能不同的软件部件在网络环境中进行交互的技术[10]。在Internet应用开发中,ActiveX必须在Visual Basic,Internet Explorer等独立执行软件中运行。
为提高软件升级和维护的方便性,将客户端接收缓冲、解码、显示部分封装在ActiveX中,这样同时也减轻客户端操作的负担。用HTML生成加载ActiveX控件主页,并将它放到ARM平台上基于Linux的Boa Web服务器中,用户访问ARM平台上的嵌入式服务器Boa时,会将ActiveX从视频服务器下载并安装,视频服务器同ActiveX实现通信,完成视频监控功能。另外为了通过Boa来实现客户端与服务器的动态交互,还需要编写CGI脚本。
在Web页面中使用ActiveX控件还需要对它进行一些封装,将视频、解码、接收显示过程所需的动态链接库及其他文件转变为*.cab格式的文件,*.cab格式文件可以存储多个压缩文件以便在Web页面中加载。将生成的ActiveX控件嵌入HTML网页中,客户端在访问时可以自动下载安装,客户端通过浏览器便可以实时显示和操作。客户端效果图如图6所示。
图6 客户端效果图(截图)
3 小结
本文主要介绍一种B/S模式嵌入式视频监控系统客户端的实现,系统编码采用H.264格式,压缩比高,减少了带宽占用。针对网络视频数据抖动现象,设计了一种缓冲机制,很好地解决了丢包乱序问题。最后,介绍了视频客户端ActiveX的制作,并将其嵌入到网页中,只需浏览器便可以实现远程监控。随着网络技术的发展,基于B/S的嵌入式视频监必将有广阔的市场空间和良好的发展前景。
:
[1]林德彬,赵慧民,谭恒良.基于ARM嵌入式局域网视频监控系统的设计与实现[J].电视技术,2006,30(9):88-89.
[2]张友生,陈松乔.C/S与B/S混合软件体系结构模型[J].计算机工程与应用,2002,38(23):139-140.
[3]张岩峰,王翠,荣赵.视频会议中的同步缓冲设计[J].计算机科学,2008,35(4):82-84.
[4]齐俊杰,胡洁,麻信洛.流媒体技术入门与提高[M].北京:国防工业出版社,2009.
[5]陈斌.H.264保真度扩展研究与无线视频监控系统的实现[D].上海:上海交通大学,2007.
[6]CASNER S,FREDERICK R,JACOBSON V.RFC3550,RTP[D].Columbia:USA Columbia University,2003.
[7]毕厚杰.新一代视频压缩编码标准——H.264/AVC[M].北京:人民邮电出版社,2006.
[8]唐玲娜.H.264视频解码优化及DSP实现[D].成都:电子科技大学,2009.
[9]郑捷航.基于ARM的网络视频监控系统设计[D].武汉:武汉理工大学,2010.
[10]夏惊涛.基于ActiveX控件的视频监控系统客户端编程[J].广播与电视技术,2006,33(1):85-88.
Design of Client for Embedded Video Monitoring System Based on B/S Structure
WU Jince1,2,DU Jinsong2
(1.Graduate School of the Chinese Academy of Sciences,Beijing 100049,China;
2.Shenyang Institute of Automation,Chinese Academy of Sciences,Shenyang 110016,China)
The design of the client for an embedded video monitoring system based on B/S structure is mainly introduced.It emphasizes on the implementation of the buffer mechanism when receiving H.264 data with RTP protocol.The method used in the video decoding and displaying process using FFmpeg and SDL are also elaborated.In the end,the application method of ActiveX component in video monitoring is introduced.The experimental result shows that the client can achieve the monitoring on remote place,and it is easy to use.
B/S;RTP;Buffer;FFmpeg;SDL;ActiveX
【本文献信息】吴金策,杜劲松.B/S架构嵌入式视频监控系统客户端设计[J].电视技术,2013,37(3).
TP393
A
吴金策(1988— ),硕士生,主研测量与控制,嵌入式系统;
杜劲松(1969— ),硕士生导师,主研计算机测量与控制、自动化系统集成等,是中国自动化学会遥控、遥感、遥测委员会成员,中国机电一体化技术应用协会常务理事。
责任编辑:任健男
2012-09-28