基于Web服务的嵌入式视频服务器

时间:2022-08-26 04:54:22

基于Web服务的嵌入式视频服务器

摘 要: 为了解决视频监控系统中多样性、异构性的设备集成难问题,采用Web服务与流媒体技术设计了一种嵌入式视频服务器。给出视频服务器的硬件结构;基于嵌入式Linux操作系统,详细阐述了视频服务器软件的设计与实现过程;视频服务器适用于具有跨语言、跨平台特性的视频监控系统的设备集成。应用于油井监控局域网中时,在单个远程终端链接情况下,视频服务器速率达25 f/s,可满足一般的监控要求。关键词:Web Services; 嵌入式系统; Linux; 流媒体

中图分类号:TN919.85-34文献标识码:A

文章编号:1004-373X(2010)22-0060-04

Embedded Video Server Based on Web Service

SUN Shi-ming1, WANG Ai-guo1, XIE Xing-zhou2

(1. College of Computer and Communication Engineering, China University of Petroleum, Dongying 257061, China;

2. Gudao Oil Plant, Sinopec Shengli Oilfield Company, Dongying 257321, China)

Abstract: An embedded video monitoring server is designed with the technologies of Web services and streaming media to solve the problems of integration of diversity and heterogeneity equipments in video monitoring system. The hardware structure of the video server is elaborated. The software design and implementation of the video server based on Linux2.6.24 is illustrated in detail. The video server is appropriate to the equipment integration of the video monitoring system with the features of cross-language and cross-platform and can be applied to monitoring system easily. The velocity of video server can reach up to 25 f/s and can meet the requirement of general monitoring when the single remote terminal is linked in LAN of well monitoring system.

Keywords: Web service; embedded system; Linux; streaming media

收稿日期:2010-06-30

目前,视频监控在煤炭安全生产[1]、楼宇安防[2]、森林火灾监控[3]等领域逐步得到应用,出现了各式各样的嵌入式视频服务器;同时,视频监控系统也向着一体化、视频数字化、监控网络化、系统集成化方向发展[4],各种视频服务器的集成和统一管理变得越来越困难。本文设计了一种基于Web Services的嵌入式流媒体视频服务器,借助Web Services跨平台、跨语言的分布式模型[5],通过RTP/RTCP协议实时传输视频流,实现了视频监控设备的无缝连接与统一管理。

1 视频服务器的硬件结构

视频服务器硬件分为核心板和底板两部分。核心板使用ARM S3C2440处理器,扩展64 MB SDRAM和64 MB FLASH外部存储器,集成时钟电路和JTAG接口电路;底板提供视频采集接口,包括视频采集芯片与MPEG压缩芯片,4线RS 232串口,由以太网控制器和RJ45接口组成的以太网接口[6]。硬件结构如图1所示。

系统通过以太网接口获取远程终端的控制数据,利用串口对设备进行操控;通过视频采集电路获取压缩后的视频数据,使用RTP协议将数据打包后通过以太网接口发送到远程终端,完成视频的实时传输。

图1 视频服务器的硬件结构图

2 视频服务器的软件设计与实现

2.1 软件总体结构

视频服务器的软件基于Linux操作系统,分为两个模块:Web Services模块和视频采集与传输模块。其中Web Services模块主要负责对摄像头及云台的操控,将操控摄像头和云台的功能接口以Web服务的形式给远程终端,从而屏蔽了摄像头和云台的异构性,方便远程终端对设备进行集成和统一管理。视频采集与传输模块主要负责将采集到的视频数据通过RTP/RTCP协议打包,然后传送给远程终端。视频服务器结构如┩2所示。

2.2 Web Services模块

Web Services使用标准的、通用的通信模型,它在HTTP,XML,SOAP,WSDL,UDDI 之上提供统一的编程模型,使用统一的方法,公共的基础结构和统一文本格式,适合于Internet/Intranet分散型应用。服务请求者与服务提供者之间通过SOAP(简单对象访问协议)消息进行绑定和通信。SOAP协议定义了用于在系统之间进行通讯的标准XML消息格式,可使用SOAP在多种计算机体系结构、语言和操作系统之间进行通信。Web Services模块流程图如图3所示。

图2 视频服务器的结构

图3 Web Services模块流程图

选用gsoap作为Linux下Web Service的开发工具。gsoap是一款使用C/C++编写的开源的Web Service开发工具,具有占用系统资源少、运行速度快、可裁减等特点[7]。gsoap工具包中提供了两个可执行文件:wsdl2h 和soapcpp2。wsdl2h.exe用来解析wsdl文档生成描述服务的C/C++头文件,soapcpp2.exe用来解析该头文件并生成框架代码[8]。

利用gsoap工具包开发视频服务器的Web Service,首先编写一个头文件service.h,声明4个Web Service接口,该头文件的主要内容如下:

typedef int xsd__int;

struct ns2_CameraInf //摄像头信息结构体

{ xsd_int Cam_ID; //编号

xsd_int Cam_width; //分辨率:宽

xsd_int Cam_height; //分辨率:高

xsd_int Cam_hue; //色调

xsd_int Cam_contrast; //对比度

xsd_int Cam_brightness; //亮度

xsd_int Cam_focus;//焦距

}

struct ns2_PanTiltInf //云台信息结构体

{ xsd_int PanTilt_ID; //编号

xsd_int PanTilt_ Rotation; //旋转角度

};

int ns2_ctrlCamera(xsd_int ictrlCam);

//摄像头控制

int ns2_getCameraInf(void *_ ,

struct ns2_getCameraInfResponse

{ struct ns2_CameraInf camera_inf;

} *_return);//获取摄像头信息

int ns2_ctrlPanTilt(xsd_int ictrl);//云台控制

int ns2_getPanTiltInf(void *_ ,

struct ns2_getPanTiltInfResponse

{ struct ns2_PanTiltInf pantilt_inf;

} *_return); //获取云台信息

根据service.h文件生成服务端框架代码及service.wsdl文档,命令如下:

# soapcpp2 service.h

生成的框架代码如下:soapStub.h:从输入头文件生成且带名称空间的头文件;soapH.h:主要头文件,所有客户机和服务源代码都要将其包括在内;soapC.c:指定数据结构的序列化器和反序列化器;soapClient.c:客户机存根例程;soapServer.c:服务器端存根例程。

另外,在gsoap工具包中还包含两个重要的文件:stdsoap2.h和stdsoap2.c/cpp。其中stdsoap2.h是stdsoap2.c/cpp运行时库头文件,stdsoap2.c/cpp是运行时C/C++库,带 HTTP/ SOAP解析器和运行时支持例程。用户可以用这两个文件和上述的框架代码方便的进行客户端/服务器端开发。程序代码在此不再赘述。

2.3 视频采集与传输模块

视频采集与传输模块将采集到的视频通过RTP协议打包发送到远程终端。过程如图4所示。

2.3.1 Jrtplib和Jthread的移植

利用Jrtplib开发程序之前,需要先将Jrtplib库移植到视频服务器的硬件体系结构上,方法如下:

(1) 下载Jrtplib和Jthread

下载地址:research.edm.uhasselt.be/~jori /page/index.php?n=CS.Jrtplib

(2) 解压

将下载的两个压缩文件解压到/usr/local /software目录中:

#tar -jxvf jrtplib-3.7.1.tar.bz2

#tar -zxvf jthread-1.2.1.tar.gz

解压后在/usr/local/software下生成jrtplib- 3.7.1和jthread-1.2.1两个目录。

图4 视频采集与传输模块软件流程

(3) 编译Jthread

进入Jthread源码目录:

#cd /usr/local/software/ jthread-1.2.1

在终端中输入:

#./configure -host=arm-linux CC=arm-linux- gcc

CXX=arm-linux-g++

执行后,会生成一个Makefile文件,执行:

#make

#make install

至此Jthread安装成功。

(4) 编译Jrtplib

进入Jrtplib源码目录:

#cd /usr/local/software/ Jrtplib-3.7.1

在终端中输入:

#./configure -host=arm-linux CC=arm-linux- gcc CXX=arm-linux-g++

执行后,会生成一个Makefile文件,执行:

#make

#make install

至此Jrtplib安装成功。

Jrtplib和Jthread安装完成后,可以看到/usr/local/lib目录增加了Jthread和Jrtplib的库文件。

2.3.2 RTP实时传输流媒体数据实现

利用RTP协议能够在单播或者多播的网络环境中实现传流媒体数据的实时传输,它的报文中包含传输媒体的类型、格式、序列号、时间戳以及是否有附加数据等信息[9-10]。多媒体数据的传输使用 UDP 来进行,每┮桓霆RTP数据报都由头部(Header)和负载(Payload)两个部分组成,其中头部前 12 个字节的含义是固定的,而负载则可以是音频或者视频数据。具体实现过程如下:

(1) 初始化RTP会话

RTPSession Rtpses;//创建RTPSession对象来代表此次RTP会话:

Rtpses.Create(2000);//调用RTPSession类的Create()方法,指定RTP会话的端口号

(2) 设置时间戳

Rtpses.SetTimestampUnit(1.0/8000.0);

//设置时间戳(单位:s),使程序的采样频率为8 000 Hz

(3) 设置目标地址

unsigned long addr = ntohl(inet_addr("192. 168.0.2" ));

//将网络字节序转换为长整型

Rtpses.AddDestination(addr,2000);

//添加目标地址,端口号为2000

(4) 发送流媒体数据

Rtpses.SetDefaultPayloadType(0);

//设置默认的负载类型

Rtpses.SetDefaultMark(false);//设置标志

Rtpses.SetDefaultTimeStampIncrement(10); //设置时间戳增量

Rtpses.SendPacket(buf, n);//发送数据,buf为数据缓冲区,n为缓冲区大小

(5) 客户端接收数据

if (Rtpses.GotoFirstSourceWithData())

{//获取接受到的各个源的数据

do

{Rtpses.AddToAcceptList(remoteIP, allports, portbase);

Rtpses.SetReceiveMode(RECEIVEMODE_ACCEPTSOME);//设置接收模式

RTPPacket *pack;

pack = Rtpses.GetNextPacket();

//处理接收到的数据

delete pack; }

while (Rtpses.GotoNextSourceWithData());

}

3 测试运行

系统测试采用C/S结构。视频服务器配置为S3C2440微处理器,运行在400 MHz,扩展64 MB NAND FLASH和64 MB SDRAM,以太网接口芯片为RTL8201BL,视频压缩芯片为MB86390,显示器为8寸16 bit TFT LCD,Linux 2.6.24内核,接入实验室局域网。视频服务调用端为联想的启天M6900 PC机,RedHat 9.0操作系统,开发环境GCC 4.3.0,QT 4.4.0和gsoap-2.7f工具包,通过gsoap调用Web服务。PC机上的运行界面如图5所示。

上一篇:基于FSM检测的移动自组网攻击分类研究 下一篇:基于8051单片机温度采集及无线发送