基于ARM11的嵌入式视频传输系统的实现
2013-06-29陈宗成邓华秋
陈宗成,邓华秋
(华南理工大学理学院物理系,广东 广州 510640)
随着图像处理技术和网络技术的不断发展,视频监控系统大致经历了三个发展阶段,前两代分别以黑白电视为代表的模拟监控系统和以硬盘录像机为代表的半数字化监控系统[1],第三代视频监控系统是指以前端网络视频为代表的全数字视频监控系统,视频从前端的采集、压缩、传输和浏览、存储全部数字化。CCD和CMOS摄像头为数字视频采集提供便利。随着视频压缩算法的发展,高压缩比、还原能力强的压缩算法不断出现,特别是伴随着流媒体技术产生的H.264视频压缩技术,为视频的实时传输和实时浏览提供便捷。
伴随着数字化视频监控系统的到来,对视频监控系统的要求也不断提高,要求实时可靠、操作简单、功能丰富、经济适用等。而嵌入式系统的基本特点恰好满足了以上要求,嵌入式视频监控系统应运而生。目前嵌入式视频系统普遍采用BS架构,虽然实现起来简单方便[2],却不利于显示端功能的升级和改进。本文根据嵌入式视频监控系统的发展现状,在ARM-Linux嵌入式系统上搭建监控系统必须的软件平台,通过CS架构实现视频的采集、编码、发送和显示功能。编码方面采用最新的H.264标准,有效地降低了码率,和MPEG-2和MPEG-4 ASP等标准相比,在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG-2的1/8,MPEG-4 的 1/3[3]。在视频发送方面,采用协议 UDP/RTP/RTCP,既满足视频服务器所需的组播特性,又能通过RTP/RTCP协议保证流媒体的实时传输[4]。
1 系统结构
本文在ARM-Linux嵌入式平台实现远程视频实时监控系统,利用现有的网络设备,满足用户远程监控的目的。需要实现的主要工作包括前端视频采集、网络传输和终端接收播放,主要功能总结如下:
1)监控前端设备通过COMS摄像头实现视频的采集;
2)在ARM-Linux平台对原始视频数据编码;
3)前端服务器与客户端通过局域网或者因特网实现视频数据的组播发送;
4)客户端接受H.264视频数据,实时解码播放。
考虑到视频监控系统需要视频的实时采集、编码和发送,因此,需要集成度高、稳定、实时性好的SoC系统。在综合考虑成本的情况下,选择三星公司S3C6410作为主控芯片。S3C6410是以功能强大的ARM11为核心的SoC芯片,使用广州友善之臂技术有限公司开发的mini6410嵌入式平台。整体硬件平台如图1所示。
2 视频采集、编码及发送
2.1 视频采集
图1 系统硬件平台
利用V4L2接口函数获取视频帧数据有3种方式:直接通过read()函数读取视频帧,用户指针方式,mmap内存映射。本文通过内存映射方式采集,采用这种方法读取方便,而且省去了大量的内存拷贝,效率较高,具体操作步骤如图2 所示[5]。
图2 视频采集流程
2.2 视频编码
本文利用S3C6410提供的MFC硬件编码器对原始视频数据进行H.264格式编码,与V4L2视频采集操作相同,MFC进行编码时,绝大多数操作都是通过I/O control接口函数来完成的,S3C6410已经提供了针对H.264视频编码的I/O control接口的封装API函数。为了减小编程工作量,本文使用这些已经比较稳定的API函数进行视频编码操作,主要步骤如下:
1)初始化编码句柄。在进行编码之前需要初始化一个编码句柄handles,该变量是一个结构体变量,其中存储了视频编码的控制信息,初始化该结构体的API函数是:void*SsbSipH.264EncodeInit(unsigned int uiWidth,unsigned int uiHeight,nsigned int uiFramerate,unsigned int uiBitrate_kbps,unsigned int uiGOPNum)。
2)将编码信息写入MFC驱动层,初始化MFC硬件。完成这一工作的API函数是:int SsbSipH.264EncodeExe(void*openHandle)。
3)获取输入缓存地址。通过函数void*SsbSipH.264EncodeGetInBuf(void*openHandle,long size)获得内核存储原始数据的帧缓存地址。
4)将原始视频大小存入内核缓冲区。通过memcpy函数,将采集到的视频数据发送该内核驱动空间,用于MFC对视频进行编码。
5)对视频数据进行编码。视频编码的API函数是:int SsbSipH.264EncodeExe(void*openHandle)。在进行编码时,有些编码器会在每个关键帧前面都添加序列参数集(Sequence Parameter Set,SPS)和图像参数集(Picture Parameter Set,PPS),造成无用的码率增加。MFC只对第一帧H.264码流上添加SPS和PPS。SPS和PPS中含有解码所必须的参数,包括帧频、图像大小等。
6)获取编码后的帧缓存地址和大小。通过API函数GetOutBuf函数获取编码后视频数据在内核中的缓冲区地址。返回的编码数据,除了第一帧图像外,每次缓冲区内保存的都包含并且只包含一个完整的NAL单元;第一帧图像编码完成之后,缓冲区除了第一个NAL单元之外,还有序列参数集和图像参数集2个NAL单元。
7)将编码数据放入环形存储队列。8)释放资源,关闭编码设备。
2.3 视频发送
本系统采用流媒体最常用的RTP/RTCP协议发送视频数据。编码后的视频数据按照RTP协议打包,并利用UDP协议对局域网组播。RTP协议的定位是应用层协议,这样便于扩展。本文利用RTP的一个C++库JRTPLIB进行视频发送,该库封装了网络协议的配置,只要调用其中的API函数就可以轻易配置网络,不过JRTPLIB本身不是针对某一种实时数据的开发库,因此,发送不同的数据流需要用户根据相应的协议进行RTP的分包和打包。
1)移植JRTPLIB到ARM平台
本系统使用的JRTPLIB版本是3.7.1。该C++库是根据RTP标准RFC3550写成的,支持Windows和类Linux操作系统,为用户提供了RTP头和网络配置接口,只要将需要传输的数据根据RTP协议进行适当修饰就可以轻易使用RTP协议发送数据。同时,JRTPLIB会自动发送RTCP控制信息到接收端。
2)初始化RTP会话实例
声明三个变量:RTPSession rtpsess,RTPSessionParams sessionparams,RTPUDPv4TransmissionParams transparams。
通过实例化类RTPSession建立RTP会话,RTP传输的大多数操作都是通过RTPSession对象提供的。同时,用到的2个参数类是RTPSessionParams和RTPUDPv4 TransmissionParams,分别用来设置RTP协议的头信息和传输信息。
3)对H.264视频数据进行RTP打包
S3C6410的MFC对视频进行H.264编码时,为了存储到介质上之后解码器能够区分每一个NAL单元,MFC在每一个NAL单元之前添加起始码0x00000001,这也是H.264标准的建议[6],但是,实时远程播放系统,解码器会根据RTP时间戳区分不同的NAL单元,因此在发送数据之前需要去掉该起始码。为了解码器获取序列信息和图像信息,MFC在第一个NAL单元之前添加序列参数集和图像参数集,这两个参数集分别作为独立的NAL单元与第一个视频NAL单元形成一个数据组。MFC编码后,输出缓冲区内的数据结构如图3所示。
图3 MFC输出缓冲区中数据结构
为了将H.264视频数据按照RTP协议传输,并且能够让接收端的解码器能够识别,需要有统一的标准对H.264数据打包和解包。本系统根据标准 RFC3984[7]对H.264打包。
4)发送视频数据
JRTPLIB调用RTPSession的成员函数完成发送:int SendPacket(const void*data,size_t len,uint8_t pt,bool mark,uint32_t timestampinc)。其中,data是打包完成的视频数据首地址;len是待发送视频数据长度;pt是发送的数据类型;mark是标示位,本文用来标示一个NAL单元的最后一个分包;timestampinc是时间戳的增量,由于每个NAL单元中的内容都是在同一时刻采集的视频数据,发送同一个NAL单元分包期间,时间戳不变,该值为0。
3 视频的接收和播放
本文在PC机上通过会话描述协议(Session Description Protocol,SDP)[8]文本与发送端通信,并使用 VLC 播放器解析该协议文本对视频流实时播放。
本系统利用BOA网络服务器将SDP文件发送到接收端,BOA使用http传输协议。接收端的VLC播放器通过http协议接收SDP文件,然后对SDP文件解析,通过RTP协议接收并播放实时视频数据。在PC端,使用VLC播放器通过http协议打开服务器端的SDP文件实时播放视频。接收端PC环境为Intel Core 2 Duo处理器,2.67 GHz,1.75 Gbyte 内存,视频采集格式为 YUV420,大小480 ×272,帧频30 f/s(帧/秒)。
图4a是单个VLC播放器实时播放效果图,经测试,播放延迟在0.5 s以内,考虑到传输延时和VLC播放器的缓冲,0.5 s以内的延迟属于正常。在视频监控期间,丢包率在0.3%以内。图4b是单个VLC播放器实时播放效果图。图4b是4个VLC播放器同时播放效果,表1为同时打开4个VLC播放器测得的数据。由于使用组播发送视频数据,同时打开多个播放器同时进行播放,画面清晰流畅,没有明显抖动,丢包率没有没有明显增加。
图4 使用VLC播放器实时播放效果
表1 4个VLC播放器信息
4 结论
随着社会的发展,视频监控系统成为安防系统中越来越重要的监控工具。近些年,网络技术和视频处理技术的不断进步,视频监控不断向智能化、网络化和集成化发展。基于以上背景,本文设计并实现了一款嵌入式实时视频服务系统。在本文的完成过程中,使用了嵌入式技术、视频压缩编码技术、流媒体实时传输技术、SDP会话描述协议和Web技术,最终实现了基本功能。经过测试,视频播放流畅,支持多用户同时在线播放,丢包率较低,达到了预期的设计目标。
[1]浅析视频监控系统发展历程[EB/OL].[2012-07-20].http://wenku.baidu.com/view/4de33302e87101f69e3195a9.html.
[2]杨晓姣,黄云霞.嵌入式视频监控系统视频服务器的设计与实现[J].电子设计工程,2011(6):184-186.
[3]胡兴军.视频编码标准H.264的技术革新及应用[J].影像技术,2009(1):24-27.
[4]李长银.基于UDP组播的分布式仿真系统实现[D].成都:电子科技大学,2008.
[5]白长青,陈沛.嵌入式终端基于Linux V4L2的图像采集系统[J].信息技术,2012(2):22-23.
[6]毕厚杰.新一代视频压缩编码标准——H.264/AVC[M].北京:人民邮电出版社,2009.
[7]RFC3984,RTP Payload Format for H.264 Video[S].2005.
[8]王荣生.SDP协议在视频点播系统中的应用[J].计算机应用与软件,2005(1):74-76.