您的位置 首页 汽车

一种RTSP嵌入式视频监控体系的规划

RTSP:即时串流协定(Real Time Streaming Protocol,RTSP)是用来控制声音或影像的多媒体串流协议,并允许同时多个串流需求控制,传输时所用的网络通讯协定并不在其定义的范

RTSP:即时串流协议(Real Time Streaming Protocol,RTSP)是用来操控声响或印象的多媒体串流协议,并答应一同多个串流需求操控,传输时所用的网络通讯协议并不在其界说的范围内,服务器端能够自行挑选运用TCP或UDP来传送串流内容,它的语法和运作跟HTTP 1.1类似,但并不特别强调时刻同步,所以比较能忍受网络推迟。而前面说到的答应一同多个串流需求操控(Multicast),除了能够下降服务器端的网络用量,更然后支撑多方视频会议(Video Conference)。

依据以太网的嵌入式视频监控得到越来越广泛的运用,如经过3G网络传给服务器,将移动机器人所收集到的视频数据经过3G网络传给服务器。流媒体技能也在不断的遍及,将现在盛行的流媒体传输技能运用到视频监控体系中是比较好的挑选,既不会占用太多的网络带宽,也能够完成较为流通视频监控。本文依据H264编码技能和对Live555二次开发,规划了一种可对柑橘成长进行视频实时收集,编码,传输的嵌入式流媒体视频监控体系

1 网络监控视频技能简介

RTSP(Real Time Streaming Protocol),即实时流传输协议,归于TCP/IP协议体系望文生义,它是一个用于流媒体传输操控的协议,能够操控流媒体在传输过程中的暂停与持续,然后便运用户完成播映器的一些根本播映功用。它也以C/S办法(客户端服务器)作业,因为结合了许多技能上的长处,现在在因特网视频运用中广泛盛行。

图1 RTSP与RTP、RTCP联系

图1 RTSP与RTP、RTCP联系

RTSP协议与RTP(Real Time Protocol)协议、RTCP(Real Time Control Protocol)的联系如图1所示,一般而言,RTSP只用来传输操控信息,这些操控信息使得媒体播映器能操控流媒体的传输,而流媒体的传输则由RTP担任,所以RTSP协议有必要与RTP/RTCP协议一同合作运用。

1.2 H.264技能

H.264技能是现在在视频编码紧缩中选用的最为遍及的一种技能。因为H.264具有更低的码率,在平等图画质量的前提下,它能够到达更高的紧缩率,与前代MPEG-2比较,紧缩比一般是它的2倍以上;H.264在算法方面愈加杂乱,所以它比较上代紧缩技能也能够供给高质量的图画。而且它的容错才能也很强,网络适应才能十分好。在本规划中,关于动态改变不是很明显的视频,H.264显现出了十分强壮的紧缩才能,使得网络带宽大大削减。本规划只选用了H.264的编码部分,运用现在最为盛行的契合H.264规范的x264工程作为编码器。

1.3 Live555开源工程

Live555是一个开源项目,运用C++言语编译,为RTSP、RTP/RTCP、SIP等规范流媒体传输协议供给解决方案,支撑现在干流的ts、mpg、mkv、h264格局的视频,被大多数流媒体服务器运用为开发渠道,VLC、ffplay等多款播映器能够点播运用Live555作为流媒体服务器的视频数据。Live555有四个根本的库,即BasicUsageEnvironment、UsageEnvironment、GroupSock和LiveMedia。前面三个库在本规划中均不需求改动,需求改动的是LiveMedia模块,它是Live555最重要的模块。这个模块的首要作用是声明一个Medium类,在Live555工程中,许多其他类都是它的派生类。

1.4 YUV图画数据剖析

常用的YUV元素图画格局有YUV422格局和YUV420格局。YUV422格局中,依照U、V在时空上的摆放次序不同,能够将他们分为YUYV,YVYU,UYVY,VYUY四种不同的摆放办法,现在大部分USB摄像头输出的原始图画都是依照YUYV格局来摆放的;按Y和UV的摆放办法不同又能够分为打包格局和平面格局,打包格局一般以英文字母planner表明,而平面格局则会用interlaced表明,打包格局较为常见,它的Y重量和UV重量在内存中是接连放置的,如图2右侧的示意图所示,而平面格局Y和UV重量则是分隔放置的,如图2左边示意图所示。

图2 YUV摆放格局示意图

图2 YUV摆放格局示意图

YUV420在摆放上和YUV422规则相同,可是Y:U:V是4:1:1的。一般情况下,运用V4L2收集USB摄像头的视频数据是YUYV交织摆放的打包YUV422格局的,可是H264编码库要求输入的视频格局是YUV420P,也即4:1:1的平面格局,所以要经过转化。本规划选用老练的libswscale库来转化原始图画数据。

2 流媒体服务器的完成

2.1 体系全体结构

本规划参阅现在盛行的视频监控体系,依据Linux的渠道,运用V4L2(Video for Linux Two)函数接口,收集USB摄像头传过来的数据,因现在一般的USB摄像头只支撑YUYV摆放的YUV422格局的数据收集,因而需求将收集到的数据格局转化为YUV420P之后,再运用x264对每一帧YUV数据进行编码,终究对Live555开源工程进行二次开发,构建流媒体服务器。本规划体系总框图如图3所示。

图3 体系架构图

图3 体系架构图

在本规划中,体系渠道为Linux,USB摄像头的型号为环宇飞扬v8,只支撑输出YUYV摆放的YUV422格局的图画数据,x264现在只支撑YUV420P的图画数据输入,因而为了保证安稳牢靠,选用FFmpeg工程中的libswscale对其进行数据格局转化,终究运用构建好的RTSP服务器对编码的数据进行实时发送传输。

2.2 构建流媒体服务器

关于不同的流媒体源,其数据摆放格局不同,因而获取SDP的办法不同。在构建新的流媒体源的基础上,需求对SDP获取部分代码进行二次开发。因而,本规划的作业分为下面两部分。

2.2.1 SDP获取代码二次开发

当RTSPServer收到对某个媒体的DESCRIBE恳求时,它会找到对应的ServerMediaSession,调用ServerMediaSession::generateSDPDescription()。generateSDPDescription()中会遍历调用ServerMediaSession中所有的调用ServerMediaSubsession,经过subsession->sdpLines()获得每个Subsession的sdp,合并成一个完好的SDP回来之。关于不同流媒体格局获取SDP信息的办法不同,因而,本规划依据OnDemandServerMediaSubsession类构建新的会话类WebcamOndemandMediaSubsession。

图4 获取SDP函数调用联系图

图4 获取SDP函数调用联系图

获取SDP信息的函数调用联系如图4所示,sdpLines()函数在OnDemandServerMediaSubsession类中现已完成,为了顺畅的获取SDP信息,咱们需求对sdpLines()运转时调用的几个函数作必定的修正,因而,需求对OnDemandServerMediaSubsession类中的几个虚函数进行重载,具体做法如下:

A、关于createNewStreamSource函数,因为本规划处理的是H264格局的源,函数中应当参加H264VideoStreamFramer::createNew()句子。

B、关于createNewRTPSink函数,同理,函数中应当参加H264VideoRTPSink::createNew()句子。

C、setSDPLinesFromRTPSink获得Subsession的sdp并保存到fSDPLines,这个函数重点是调用getAuxSDPLine,因而需求重构getAuxSDPLine函数。getAuxSDPLine函数所调用的chkForAuxSDPLine也需求重载。关于H.264文件,是不能从rtpSink中获得PPS/SPS的,所以有必要调用startPlaying函数对视频流播映一下才行,播映之后又会封闭,这点在树立衔接的时分能够用打印函数调用流程以便了解的愈加清楚。鄙人面的伪代码中,能够看到之后又调用了chkForAuxSDPLine这个函数,这是为了保证在函数退出前能正确获得AuxSDP,所以在chkForAuxSDPLine函数中需求循环查看是否获得AuxSDP。伪代码如下所示。

rtpsink = sink;

rtpsink->startPlaying(*source, 0, 0);// 开端播映

chkForAuxSDPLine(this); // 循环查看

sdp_line = strdup(rtpsink->auxSDPLine());//保存

mp_dummy_rtpsink->stopPlaying(); // 中止播映

return mp_sdp_line; // 回来值

2.2.2 构建WebcamFrameSource类

WebcamFrameSource归于一个source类,也就是一个能够供给视频源的类。流媒体开发大都具有类似的特征,Live555中也承继了source和sink的精力,简而言之,Source就是发生数据的方针,而Sink节点是数据终究流向的方针,Sink的数据有必要经过source读取。Live555工程中尽管现已完成好很多的source,可是并没有能够完成直播摄像头过来的数据的功用,因而,二次开发的首要任务之一就是构建新的source,该source应该具有将H264的打包数据存放在内存中,而且能够传送给H264VideoRTPSink。本规划中,依据FramedSource构建WebcamFrameSource类。

关于WebcamFrameSource类,首要开发作业是在其结构函数中装备好V4L2收集摄像头数据,x264编码优化设置,作为一个source类,每次从该source中取数据时,都会调用doGetNextFrame函数,该函数作为FramedSource类中的一个虚函数,能够在新结构的WebcamFrameSource类中进行重载。对V4L2设备的初始化流程如图5所示。

图5 V4L2初始化设置

图5 V4L2初始化设置

X264视频编码初始装备伪代码如下所示。

ctx->force_keyframe = 0; // 不运用强制关键帧

x264_param_default_preset(ctx->param, fast, zerolatency); //预设为零推迟

ctx->param.b_repeat_headers = 1;

ctx->param.b_cabac = 1; //支撑cabac

ctx->param.i_threads = 1; //缓冲区数据被取完下一任运用不会呈现死锁

ctx->param.i_fps_num = 30; // 帧率为30

ctx->param.rc.i_bitrate = 150; // 默许码率

ctx->x264 = x264_encoder_open(ctx->param); // 运用设置好的参数翻开编码

x264_picture_init(ctx->picture); // 输出图画初始化

别的,也需求对libswscale的运用做必定的初始化,在本规划中,libswscale首要用来转化V4L2输出的yuv422格局数据为YUV420,其间首要是装备图画高度,宽度,输入输出格局,涉及到的函数首要是sws_getContext和avpicture_alloc,在此不再做具体叙说。

在从WebcamFrameSource这个流媒体源中取数据时,都会调用doGetNextFrame这个函数,此函数是FramedSource类中界说的虚函数,因而需求在构建WebcamFrameSource类时进行重载。从流媒体服务器宣布一帧数据的流程如图6所示。

图6 数据传输流程图

图6 数据传输流程图

依照流程图结构新的流媒体源,而且依据帧率设置读取两帧的距离推迟时刻,能够满意实时性要求。

3 体系完成

3.1 软硬件环境

服务器硬件环境为TI的DM3730处理器,256MB运转内存,该处理器依据Cortex-A8架构,主频为1GHz,并选用比较通用的环宇飞扬V8的USB摄像头。软件方面,依据Linux 2.3.32内核,并装载Angstrom文件体系。

客户端为一般PC,运转Ubuntu 10.04,客户端衔接程序运用FFmpeg项目中的ffplay,该播映器能够很好的支撑RTSP点播。

3.2 移植关键

本规划中需求编译的库文件为x264,以及libswscale,V4L2现已包含在Linux内核驱动中,x264能够下载到独自的工程,而libswscale包含在FFmpeg工程中。

关于x264工程的编译,本规划直接从x264官网下载版别号为20140104-2245的源码,运用如下指令装备。

./configure –prefix=/home/x264 –enable-shared –enable-static –enable-debug –cross-prefix=arm-none-linux-gnueabi- –host=arm-linux

指令的意义大致为装置目录为/home/x264,一同编译静态和动态库文件,使能调试,并设置好交差编译东西链。装备好后运用make;make install即可得到编译好的方针板文件。然后将x264.h和x264_config.h复制到方针板的/usr/include目录,库文件复制到/usr/lib目录。

要获取libswscale,需求先编译FFmpeg,本规划选用的FFmpeg版别号为0.8.15,装备FFmpeg的指令如下所示。

./configure –prefix=/home/FFmpeginstall/ –enable-shared –target-os=linux –enable-cross-compile –cross-prefix=arm-none-linux-gnueabi- –arch=arm

装备好之后,运用make;make install指令,将装置目录下include中libswscale目录复制到方针板的/usr/include目录,lib目录中的libswscale.a和libswscale.so复制到/usr/lib目录。

然后再运用穿插编译东西运用方才编译好的这些库文件,编译方针板可履行的流媒体服务器主程序,编译好之后将可履行程序拷贝到方针板的/opt目录下。

3.3 优化

因为运转环境为嵌入式体系,资源有限,而且又要保证流播映的实时性,因而需求做一些调整。本规划中程序运转担负首要会集在编码部分,为了减轻编码担负,运用libswscale将分辨率为640×480的视频流通化为320×240巨细的视频流。在视频传输过程中,下降帧率,终究确定为15帧的帧率。为了保证实时性,对x264编码参数预设为快速,零推迟。

3.4 体系测试运转

当服务器敞开之后,客户端PC经过以太网与方针板衔接,设置客户端PC网卡地址,保证在同一IP网段上面,在客户端给ffplay传入RTSP://192.168.71.128:9554/webcam参数。

结语

在当下RTSP技能被遍及运用的布景下,本文构建了一个结合实时视频收集、编码和嵌入式技能的RTSP流媒体服务器,并选用现在常用的支撑RTSP技能的FFplayer作为客户端播映器,完成了嵌入式视频监控体系的规划,整个体系本钱低价,安稳牢靠,而且负荷方面根本能满意中小型运用的要求,具有必定的参阅价值。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/284449.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部