张营凯,张 旭
(上海理工大学 光电信息与计算机工程学院,上海 200093)
视频监控是光电行业的一个重要领域,随着通信技术和多媒体技术的发展,嵌入式视频监控摄像系统得到了广泛的应用,人们对视频监控的要求和质量也越来越高。因此视频监控摄像系统呈现出数字化、网络化两个主要特点。尤其近年来流媒体技术的发展更加促进了实时视频摄像的发展。
嵌入式技术是先进的计算机技术、超大规模集成电路、软件技术和各个行业相关应用相结合的产物。嵌入式系统是以应用为中心,软硬件可剪裁,能适应应用系统,对功能、可靠性、成本、体积、功耗等综合性要求较高的专用计算机系统。嵌入式系统是相对于通用计算机系统而提出的。嵌入式系统也是一种软硬件混合系统。嵌入式操作系统采用Linux操作系统,Linux系 统源码开放,内核功能强大,多任务,易于裁剪,通信功能完善,具有良好的开发工具和环境。基于嵌入式流媒体系统体积小、价格便宜、功耗低,尤其是实时性效果好,所以得到了广泛的应用[1-3]。
图1所示为流媒体服务器系统硬件设计平台,ARM选用海思公司的HI3511,HI3511是基于ARM926EJ内核的32位RISC的处理器,具有标准32位ARM指令集和16位THUMB指令集。HI3511集成了丰富的外围部件,主要有外部总线接口EBI、USB2.0接口、以太网10/100MMAC接口,用来仿真和烧写程序用的J-TAG接口、以及音视频输入输出接口等接口。其硬件结构见图1。
HI3511片内还集成了及协同视频硬件加速引擎。使得HI3511成为高性能通信媒体处理器,具有高集成、可编程、支持H.264和MJPEG-4等多协议,广泛应用于实时视频通信领域,其中H264MainProfile算法极大地提高了视频质量,并且能够提供灵活的场编码或帧编码,视频处理单元还支持双码流编码,处理器足以满足视频监控的相关要求。
嵌入式技术是一种采用处理器与嵌入式操作系统并加上所需要的应用程序软件,实现计算机一些功能的非PC设备。嵌入式操作系统采用Linux操作系统,流媒体系统由流媒体服务器和客户端组成,其中流媒体服务器是最主要部分。流媒体技术的主要特点就是边下载边播放。流媒体实时传输协议主要采用RTP/RTCP以及RTSP等网络协议。其嵌入式流媒体系统总体结构见图2[5]。
图1 硬件结构框图Fig.1 Structure of hardware
图2 流媒体系统结构图Fig.2 Structure of stream-media system
流媒体技术是把连续得到媒体信息经过压缩后放到网络服务器上,这样客户就可使实现边下载边观看,而不需要将整个媒体文件全部下载完毕,所以流媒体技术非常适合现场事件,可以随机访问和快进或后退观看内容[6]。
流媒体实时传输方式分实时流式传输和顺寻流式传输两种。实时流式传输可以保证媒体信号与网络连接相匹配,使媒体信息可以被实时看到,而且实时传输允许对媒体进行更多的控制,要比HTTP服务器复杂。顺寻流式传输是顺序下载,但客户只能观看已下载的部分,顺序流式传输可以使用HTTP服务器,比实时流式传输要简单。
因为系统的关键就是流媒体服务器,所以这里也主要介绍与服务器有关的RTSP模块、RTP模块和用户界面的线程实现,这里首先介绍一下Linux的网络通信过程[7]。
Linux中网络通信是通过Socket套接字来实现,它是一种特殊的文件描述符,由于Linux的设备无关性,可以看做普通的文件描述符来操作,通过向描述符读写来实现网络通信。Socket使用的是C/S模式,常见的Socket有流式Socket、数据报Socket和原始Socket三种类型。套接字编程采用C/S模式,即由客户端向服务器进程发出请求,服务器进程执行被请求任务并将响应结果返回给客户端。套接字函数包括:Socket()、Bind()、Listen()、Accept()、Send()、Recv()、Close()等。基本流程见图3。
其基本过程是Socket()函数创建一个用于通信的套接字并分配一个绑定端口号,Listen()函数是套接字成为一个监听套接字,调用Accept()来启用套接字,此后程序就可以等待客户端的连接并处理其请求。客户端也建立一个Socket,返回描述符。配置端口号和IP地址,向服务器发送连接请求并接受服务器发回的确认连接信息。通信结束后,关闭双方的Socket。
3.2.1 实时流协议(real-time streamming protocol,RTSP)
图3 网络通信流程图Fig.3 Network communication flowchart
RTSP定义了一对多程序如何有效通过IP网络控制多媒体数据。RTSP是应用层协议,有很大的灵活性,可以用在多种操作系统上。RTSP在系统结构上位于RTP/RTCP之上,使用RTP/RTCP完成数据传输,主要用来控制具有实时特性的数据的传送,单本身并不传送数据。RTSP可以为流媒体提供诸如播放、暂停、快进等操作,负责定义具体的控制消息、操作方法和状态码等。RTSP的控制作用主要通过rtspsvr.c和rtspparse.c两个C语言文件来实现[7,8]。
(1)rtspsvr.c包含一些处理方法的函数。如下:
RTSP_SessLists_Init,用于建立一个RTSP会话队列,保存已经建立连接的客户端;
RTSP_SessLists_Destroy,清除队列,与客户端断开后才使用;
RTSP_SessLists_Add,将已建立连接的客户端加入到会话队列中;
RTSP_SessLists_Remove,删除一个已经存在的RTSP客户端;
RTSP_SVR_Create,RTSP服务器初始化,分配端口,建立RTSP会话队列;
RTSP_SVR_Destroy,释放RTSP资源,关闭RTSP监听,释放RTP资源;
RTSP_SVR_Start,线程函数,用于调用RTSP_SVR_Proc函数;
RTSP_SVR_Proc开始RTSP监听,接受客户端发送的RTSP请求;
RTSP_Handle_Event,用于处理RTSP的会话方法。
(2)tspparse.c是用来处理文本文件的,包括的函数如下:
RTSP_Status,描述RTSP的状态码;
RTSP_Methods,描述RTSP的方法,如PLAY,SETUP等;
RTSP_Get_Status_Str,用于获得RTSP的状态码;
RTSP_Parse_Url,,用于分析URL,获取文本中的端口信息等;
RTSP_Get_Cseq,用于获得RTSP文本交互中的CSEQ,以判断是否是相应的请求与回答。
3.2.2 实时数据传输协议(real-time protocol,RTP)
RTP提供时间标志,序列号及保证数据实时传输的方法。RTCP是RTP的控制部分,用来保证服务质量和成员管理。
协议的工作原理:应用程序开始一个RTP会话时将使用两个端口:一个是RTP端口,另一个是RTCP端口。RTP负责数据的打包和传输;RTCP则在RTP会话期间周期地发送一些RTCP包,以用来监听和保证RTP数据包的顺序传送,以及流量控制或者拥塞控制。流媒体服务器也可以利用这些信息动态的改变传输速率,比较适合网上实时数据的传输。系统通过参考相关文档和网上资源将RTP的实现编写为两个文件:rtp.c和rtp.h[8]。
(1)rtp.c主要是一些函数实现:
RTP_header是一个RTP的包头,payload用于存放多媒体数据,payload_len是多媒体数据的长度,不包含RTP的长度。
RTSP协议与RTP协议的关系是:RTSP用来控制消息和操作等,RTP则具体用来传输多媒体数据;RTSP交互之后,RTP数据包才会发送。
Linux内核为Linux处理图形界面提供的最基本的底层驱动接口。应用程序不需要了解底层硬件的具体情况,只需通过设备节点对设备进行操作,就可以完成图像的显示[9]。
SDL是一个跨平台、高性能的开源共享库,广泛应用于播放器、游戏的设计。SDL使用系统的底层API,但是在平台间统一了接口,使得基于SDL的程序具有良好的跨平台特性。SDL有以下优点:(1)直接使用内核提供的接口,运行效率高;(2)跨平台,移植性好;(3)面向应用,提供对图形,音频的高级应用;(4)提供了多种应用,如线程、消息循环、互斥锁、定时器等;(5)可配置性;(6)资源丰富。在线程设计上使用两个线程即用户界面线程和工作者线程。用户界面线程包括音视频同步播放和接受并响应用户的操作,然后将工作者线程解码出的音视频数据传递给使用者。线程的工作流程见图4。其客户端运行界面见图5。
图4 视频线程流程图Fig.4 Video thread flowchart
图5 客户端界面Fig.5 Client interface
基于嵌入式的流媒体摄像机是光学器材的一个重要应用,尤其采用最新CMOS传感器后,其灵敏度有了额较大提高、曝光时间缩短、单位像素尺寸的缩小,使得视频清晰度有了很大提高。在图像压缩方面采用MPEG-4算法,有效减轻了网络传输负担,有利于视频的实时性传输。嵌入式流媒体摄像机融合了现代通信技术和多媒体技术,尤其是嵌入式技术的应用,使得嵌入式流媒体摄像机获得了快速的发展。这种摄像机具有模块化设计,体积小,易于安装、使用和维护。支持即插即用的解决方案,只要接入网络,分配一个IP地址,就可以实现流媒体的传输,实现无人值守,就可以保证系统稳定可靠的运行。正因为如此,流媒体技术得到了越来越广泛的应用。
[1] 钟玉琢,向 哲,沈 洪.流媒体与视频服务器[M].北京:清华大学出版社,2003.
[2] 徐波涛,王 玲.基于ARM的流媒体传输方法的研究[D].南京:南京理工大学,2007.
[3] 师娟娟,彭 迪.基于ARM9的嵌入式Linux移植[J].武汉理工大学学报,2008,30(2):205-208.
[4] 马忠梅,马广云.ARM嵌入式处理器结构与应用基础[M].北京:北京航空航天大学出版社,2002.
[5] 冯国进.嵌入式Linux驱动程序设计从入门到精通[M].北京:清华大学出版社,2008.
[6] 钱 斌,徐海云.嵌入式Web服务器在CTM系统中的应用[J].微计算机信息,2006,17(5):99-101
[7] 张 威.Linux网络编程教程[M].北京:首都师范大学出版社,2002:143-144.
[8] 求是科技公司.8051系列单片机C程序设计完全手册[M].北京:人民邮电出版社,2006:209-210.
[9] 李 涛,董云卫.一种嵌入式软件构件和构件库[J].计算机科学,2006,33(11):259-263.