基于RTMFP协议的视频监控系统设计与实现

2016-04-11 15:15陆莉莉裴斌张向通孙延鹏季一木
电脑知识与技术 2016年4期
关键词:流媒体视频监控

陆莉莉+裴斌+张向通+孙延鹏+季一木

摘要:RTMFP(RealTime Media Flow Protocol,实时媒体流协议)是一种基于UDP的支持P2P安全协议。为了更好地满足视频监控流的安全性和实时性,文中设计一种基于RTMFP的视频监控系统服务端和客户端,并重点介绍了平台的配置搭建、视频流编解码、视频流发布流程和视频流文件控制等模块的设计和实现。

关键词:对等计算;视频监控;流媒体

中图分类号:TP37 文献标识码:A 文章编号:1009-3044(2016)04-0208-03

Research of the Application and Analysis for Flash P2P Protocol

LU Li-li1,PEI Bing1,SUN Yan-peng2,ZHANG Xiang-dong1,JI Yi-mu2

(1.College of Software, Nanjing College of Information Technology, Nanjing 210046, China; 2.College of Computer, Nanjing University of Posts and Telecommunications, Nanjing 210023, China)

Abstract:RTMFP (Media Flow Protocol RealTime) was a kind of security protocol based on UDP and supported for P2P. In order to better meet the requirements of the safety and real-time of video monitoring, a video monitoring system server and client based on RTMFP was designed, and introduced the design and implementation of modules in the system, such as the configuration and building of the platform, video stream encoding and decoding, video streaming delivery process, video stream file control, and so on.

Key words:Peer to Peer; video control; flow media

1 背景

RTMFP使用UDP传输数据以提高数据传输速度,并采用类似TCP的连接建立方式,保证连接的可靠性[1]。FLASH P2P是由Adobe公司开发的基于Flash平台实现的P2P技术,该技术基于RTMFP [2],RTMFP协议为直播和实时通信程序提供了高质量通信解决方案。

目前,RTMFP协议用在视频流通信中,主要是用于视频播放系统和视频点播系统[3]。但是视频监控是当前物流、交通、智慧小区和公安等应用必备支撑技术之一,无线技术、P2P技术和EPON等[4-6]技术都应用到视频监控系统中,但是这些监控系统还是基于传统的RTMP(RealTime Media Protocol,实时媒体流协议),由于视频监控内容涉及用户隐私,而RTMFP协议在传统P2P和RTMP协议基础上引入了安全机制[7],所以基于RTMFP协议搭建视频监控平台具有很好的创新性和应用价值。在FLASH P2P 技术中,两个节点经过服务器验证后可以彼此直接通信,降低了服务器端的带宽需求。所以此方案很适合于大范围的部署应用,例如企业私有视频点播(VOD)系统、实时视频监控、音视频聊天和多人游戏等。RTMFP因为使用UDP封装,在提升传输速度的同时,也需要通过两个功能提高连接的可靠性。文中主要研究RTMFP协议在视频监控中的应用以及H.264格式视频的FLV封装。

2 基于RTMFP的视频监控系统和实现架构设计

图1 基于RTMFP的视频监控系统架构

基于RTMFP协议的FLASH P2P视频监控模块整体架构如图1所示,具有视频采集模块、视频编码与发送模块、P2P认证与管理模块和视频播放模块。其中,视频采集模块负责监控视频的采集,其中视频监控设备采用普通IP网络摄像头。视频编码与发送模块将视频流进行H.264编码并将H.264视频以FLV格式封装,封装后以RTMP协议将视频流发送给流媒体内容服务器,P2P认证与管理模块负责P2P节点的RTMFP连接认证以及P2P共享组的创建、维持与结束工作,视频播放模块播放显示接收到的FLV视频流。P2P节点间以RTMFP协议进行数据通信以及视频流数据传输。

为了实现图1所示的架构,系统采用Flash Builder、Eclipse作为实现平台,使用ActionScript语言和JAVA语言进行开发。其中,RTMFP协议分析模块由JAVA编程实现,视频监控模块中视频编码与发送模块由C++编程实现,结果显示模块由ActionScript语言编程实现。监控视频数据以RMTPF协议传输。Flash Builder是一个软件开发工具,由Adobe公司开发而成,可以作为Flash程序的开发平台。视频监控模块采用Cumulus作为节点的RTMFP认证服务器,Cumulus 服务器具有跨平台、体积小和可扩展的优点,是一款可以支持RTMFP协议认证的轻量级的开源脚本服务器。RTMFP视频监控模块功能包括视频采集、视频编码与发送和视频播放,其中视频采集采用普通IP摄像头,然后视频编码模块对摄像头采集的视频数据进行H.264编码并进行FLV封装并发送到内容服务器。节点之间以RTMFP协议通信,OpenRTMFP/Cumulus服务器负责节点认证,Tracker服务器负责P2P共享组的创建、维护、结束工作。

3 基于RTMFP的视频监控系统配置和主要功能实现

3.1 Cumulus 服务器安装配置

本章设计的基于RTMFP的视频监控系统方案,采用Cumulus服务器作为认证服务器[8]。Cumulus脚本服务器的主要有如下功能:1)支持p2p点到点服务;2)支持现场直播;3)支持RPC,pull,push 切换,并能和所有的AMF客户端与服务器端通信;4)支持通过脚本程序编写应用。5)支持功能扩展;6)支持负载均衡。

Cumulus服务器由官方提供源代码,若想启动并使用Cumulus服务器,可以先下载源码自行编译运行,并且可以动过编写lua脚本程序个性化服务器功能。Cumulus服务器的编译、安装、配置过程如下:

Step1. 下载Cumulus脚本服务器源码。//网站搜索下载

Step2. 下载并安装POCO运行库。

cd D:\poco-1.4.8

"%VS100COMNTOOLS%\vsvars32.bat"

buildwin 100 build static_mt both Win32 nosamples devenv

打开(1)中下载的Cumulus服务器源码工程,在“项目“属性的附加包含目录里添加下载的poco库。

Step3. 下载并安装openssl,结束后同Step2中一样将代码库添加进Cumulus工程中。

Step4. 编译Cumulus:

OpenRTMFP-Cumulus/CumulusLib

make

cd ../CumulusServer

make

Step4. 进行Cumulus服务器配置:

打开Cumulus/CumulusServer/CumulusServer.ini文件进行如下修改可以完成对服务器的重新配置:

;CumulusServer.ini

port = 1935

udpBufferSize = 114688

keepAlivePeer = 100

keepAliveServer = 10

[logs]

name=log1

directory=C:/CumulusServer/logss

3.2 视频编码发送模块实现

视频编码发送模块是基于RTMFP协议的视频监控模块中的核心部件,它主要实现以下功能:1)原始图像数据的H.264编码;2)对H.264编码后的数据进行Flv封装;3)将封装后的Flv格式视频发送到流媒体内容服务器。视频编码采用开源H.264视频编码器X.264,视频经H.264编码之后调用视频格式封装函数将视频数据封装成Flv格式并发送给内容服务器进行分发。

1)原始图像数据的H.264编码压缩

X.264只是提供源代码库,没有直接可用的接口,为了方便模块的设计实现,本文在将实现的视频编码与发送模块中对X.264的编码API进行了重新封装,以下是H.264编码的具体实现过程:

2)转换YUV以及RGB的颜色空间

首先原始的视频数据可以通过一般的IP网络摄像头采集获得,摄像头获取的初始视频数据格式为RGB24。但是X.264标准要求,编码的输入流必须符合标准的YUV420的图像采样格式。所以,在进行H.264编码前,需要将视频数据的RGB颜色空间进行向YUV颜色空间的转换。实现此功能的接口封装为:

InitLookupTable(); //该接口的功能为色彩空间转换前的初始化操作;

RGB2YUV420(int x_ dim, int y_ dim, unsigned char * bmp, unsigned char * yuv, int flip);

//该接口的功能为对色彩空间进行实际转换。

3)设置H.264编码参数

对H.264编码参数进行设置,实现此功能的接口封装为:x264_ param_ default(x264_ param_ t * param);

对当前需要编码的图像参数进行设置:需要对数据帧的数量、视频数据的比特率、采样图像的高度以及长度宽度、视频数据的帧率等参数进行设置,以完成编码预设置。

4)初始化编码器

第2)步中设置的编码参数将作为编码器的初始化参数,实现此功能的接口封装为:

x264_t *x264_encoder_open ( x264_param_t *param );

编码器初始化失败时,函数将返回NULL,此时需要对编码器初始化结果进行处理。

5)进行编码空间分配

如果编码器初始化成功,那么就要给此次编码分配足够的内存空间,实现此功能的接口封装为:

Void x264_picture_alloc(x264_picture_t *pic, int i_csp, int i_width, int i_height);

6)图像编码

最后将以上所有步骤初始化完成后的数据作为编码输入,然后通过以下接口封装进行图像的编码:

int x264_encoder_encode( x264_t *h,x264_nal_t **pp_nal, int *pi_nal,x264_picture_t *pic_in,x264_picture_t *pic_out );

7)资源回收

编码结束以后,则回收系统资源并且关闭编码器,实现此功能的接口封装为:

void x264_picture_clean( x264_picture_t *pic );

void x264_encoder_close( x264_t *h );

至此,完成了对视频采集模块(普通IP摄像头及其驱动系统)所采集的初始视频数据的H.264编码。进行H.264编码后的网络抽象层单元(NALU)排列顺序依次为:SPS-PPS-SEI-IDR-nonIDR---nonIDR。

3.3 H.264编码数据的Flv封装

视频原始数据进行H.264编码结束之后,我们可以对编码后的数据进行Flv格式封装。

Flv是二进制文件,由两部分组成,分别为Flv Header以及 Flv Body。而Flv Body由多个Prevoius Tag Size字段和Tag字段组成。Tag又可以细分成三种类别,分别为代表音频流的audio标志,代表视频流的video标志,以及代表脚本流的script标志,同时,每个tag在组成部分上有两部分构成,分别为Tag Header字段以及Tag data字段对。

Flv文件具体组成如下:

FLV header (9 byte)

previous tag size0(4byte ,默认为00 00 00 00)

Metadata Tag(有关Flv视频和音频的参数信息,)

previous tag size(4byte,代表Metadata的长度)

Video Tag1(视频配置信息,大小通过计算获得)

previous tag size1(占用4个byte 视频配置信息大小)

Audio Tag2(音频配置信息,大小通过计算获得)

previous tag size2(占用4个byte 音频配置信息大小)

…..

Tag N

previous tag size N。

从第四个Tag开始,Tag里内容依次是音视频数据及其前一个tag大小。

将H.264编码数据进行Flv封装的实质是把H.264视频流数据以NALU为单位按上述Flv文件的结构顺序写入Flv文件的tag中。具体的实现方式,参考附录中关键代码。

3.4 Flash客户端实现

Flash客户端为整个Flash P2P视频监控与分析系统的显示模块,其主要功能如下:1)多路监控视频流播放;2)RTMFP视频传输协议分析模块结果显示。表1为视频播放模块所用到主要类。视频的播放以及播放控制,主要通过NetStream类的方法。

表1 视频播放模块主要类

[Video类\&创建视频对象,作为视频流容器,对视频文件进行编码处理。\&NetConnection类\&创建连接对象,连接远程服务器,获取服务器认证。\&NetStream类\&主要作用是创建资源发布或者接受流。该流的创建依赖于NetConnection对象。\&]

3.5 视频播放流程

Flv格式封装的视频是Flash Player播放基本视频格式。可以通过一些工具把其他的视频文件格式转换为.flv格式,比如Flash CS3自带的工具Flash Video Encode,本文所用的视频格式封装方法为3.2所实现的视频编码发送模块,经过视频编码发送模块编码、封装、发送后,显示模块所得到的视频流为标准的Flv格式视频流。

加载一个视频文件并播放,通常可以分为三步实现。其步骤如下所示。

Step1:节点建立与服务器的连接进行认证或者建立与其他节点的连接。完成此步骤的代码如下所示。

var nc1:NetConnection = new NetConnection();

nc.connect(RTMFP:\\);

Step2:创建视频数据接收流。利用步骤1所建立的连接打通数据接收流,完成此步骤的关键代码如下所示。

var ns1:NetStream = new NetStream(nc);

ns.play("monitor");

Step3:为即将播放的视频流创建一个视频容器。该视频容器负责将接收到的视频流数据进行解码操作。完成此步骤的代码如下所示:

var vid:Video = new Video();

vid.attachNetStream(ns);

通过以上三个步骤的操作,视频文件就被加载并播放。

3.6 视频文件信息获取

视频流的信息包括视频的持续时间、视频显示宽度及高度、视频播放帧速等。显示视频流的信息可以通过调用onMetaData函数,onMetaData回调函数可以获取元数据的信息。

4 结束语

文中实现了RTMFP协议在视频监控中的应用,并使用开源Cumulus服务器作为认证服务器,能够将IP摄像头采集到的视频数据进行H.264压缩编码,然后封装成适合Flash player播放的Flv格式,发送给视频服务器进行内容分发,用户可以通过电脑、智能手机等设备进行观看。由于采用了Flash P2P技术,使服务端带宽开销减少和服务端计算资源开销也大幅度降低。为视频监控系统在智慧城市、智慧小区和智慧物流等领域的应用推广赶到借鉴作用,进一步可研究基于视频内容的监控和搜索。

参考文献:

[1] Campennì M. Adobe's RTMFP Profile for Flash Communication[J]. Journal of Theoretical Biology, 2014, 344(6): 49-55.

[2] Gao Q T, Liu J L, University T, et al. Application of RTMFP to P2P Video Communication[J]. Computer Systems & Applications, 2012.

[3] 陈木朝, 刘爱华. 基于RTMFP协议的视频播放系统设计与实现[J]. 电脑编程技巧与维护, 2013(18): 48-49.

[4] 付存宇. 基于 3G 网络的嵌入式无线视频监控系统设计[J]. 计算机与现代化, 2013(4): 184-186.

[5] 董春利. 基于 EPON 技术的智能小区视频监控系统[J]. 光纤与电缆及其应用技术, 2013, 1: 011.

[6] 苏爱国, 郭世安, 王杰敏, 等. 基于 P2P 视频监控技术的应急指挥系统研究[J]. 移动通信, 2012, 36(6).

[7] Adobe's RTMFP Profile for Flash Communication[EB/OL].http://tools.ietf.org/html/rfc7425.

[8] Use RTMFP for developing real-time collaboration applications[EB/OL].http://labs.adobe.com/technologies/cirrus/.

猜你喜欢
流媒体视频监控
基于云服务的P2P流媒体技术在远程教学视频传输中的应用
实时流媒体数字水印系统的实现及其性能评价