一种GB28181媒体流汇聚转发的方法
技术领域
本发明涉及计算机通信领域,尤其涉及一种GB28181媒体流汇聚转发的方法。
背景技术
现有媒体流汇聚转发存在的问题有以下几点:
1:根据国标GB/T28181《安全防范视频监控联网系统信息传输、交换、控制技术要求》协议,当支持国标GB/T28181协议的摄像机注册到SIP(会话初始协议)信令服务器之后,由SIP信令服务器发起视频实时播放指令,同时播放指令中包含媒体流接收端IP地址以及接收端口,此时支持国标GB/T28181协议的摄像机接收到播放指令将会向指令中指定的目的IP以及端口以P2P的方式发送数据流,因此在这种方式下,如果具有多个媒体流接收目的请求位于国标GB/T28181协议系统内的摄像机实时播放的情况下,摄像机无法承担超出自身硬件设备设置的最大连接路数,一般是10路为上限,同时接入数过多也将导致摄像机码流输出不稳定,在实际国标GB/T28181协议系统使用中产生非常大的局限性。
2:实际运用场景中对于运行在GB/T28181协议体系下的监控系统中特有的安全性要求,不可能允许媒体流接收端无管理、无权限地方问前端摄像机,让前端摄像机直接和媒体流接收端进行互联,而是需要进行安全隔离,现有GB28181协议的信令以及媒体流组织传播方式很难实现实际使用中的安全隔离要求。
3:在GB/T28181协议体系下的平台互联,也无法保证多方平台之间处于同样的局域网或者专网,也无法保证前端摄像机设备以及媒体流接收端处于同一局域网或者专网中,因此对于不同网络结构GB/T28181协议体系在前端设备的访问上将产生极大的困难,例如通过各种20位数字的GB/T28181编号去访问前端设备。
4:GB/T28181在最新版本2016版本中仍旧没有对媒体数据流的QoS机制进行描述,因此在整个GB28181协议体系下的系统运行媒体流发送端到媒体流接收端之间的网络质量的流量控制很难保证。
发明内容
本发明的目的在于提供一种GB28181媒体流汇聚转发的方法,实现在国标GB/T28181协议体系内的前端摄像机设备一路数据多路复制转发、设备和外围接入端安全隔离、设备资源能够使用DNS(域名解析),不用通过复杂繁琐的20位国标协议编码以及保证网络带宽质量。
为达成上述技术目的,本发明的技术方案如下:
一种GB28181媒体流汇聚转发的方法,包括以下步骤:
步骤一、基于达尔文流媒体服务器平台中具备的原有功能,通过读取SDP文件中转媒体数据流方式设计SDP文件,设计步骤包括:
①、对于国标GB/T28181协议中常用的数据流打包格式PS流方式,将SDP文件中的视频属性字段集合中描述流结构的字段写成: a=rtpmap:96 MP2P/90000,a=rtpmap为固定格式,96为负载类型,MP2P为编码类型,90000为时钟频率;
②、接着上一行a=rtpmap:96 MP2P/90000,设计a=fmtp:96,其中a=fmtp为固定格式,96为负载类型;
③、基于达尔文流媒体服务器作为读取SDP方式下的接收中转,增加达尔文流媒体服务器特有的属性字段格式a=x-qt-relay-addr, a=x-qt-relay-port,其中a=x-qt-relay-addr字段表示中转目的,该字段后面跟着第一个IP地址为接收媒体数据流的地址,即为汇聚服务器的IP地址,第二个字段为转发目的IP地址,即为反射服务器IP地址,在中转地址列表之后的最后一个数字表示TTL值,TTL值表示在UDP传输方式下数据包经过几跳路由器会被抛弃的数值;所述a=x-qt-relay-port字段有两行,分别表示视频媒体数据端口和音频媒体数据端口,达尔文流媒体服务器将自动将每条媒体端口加一作为网络控制协议端口;
④、根据RTSP,在UDP传输方式下传输音视频码流,每条码流将占用一对端口,每对端口中RTP为偶数端口,RTCP为奇数端口;
步骤二、基于达尔文流媒体服务器原有配置文件设置读取SDP文件的中转配置或者通过数据库方式进行读取配置;
若通过读取SDP方式中转的配置,除指明SDP文件存放的位置信息,还通过增加announced_destination属性配置字段,指明汇聚服务器接收到前端设备发送过来的码流之后要通过ANNOUNCE指令发送到哪一个目的,并且通过ANNOUNCE指令对码流进行唯一标识;
步骤三、基于达尔文流媒体服务器框架在SDP为源的中转信息头文件中增加SDPOutputInfo类结构;
步骤四、在SDP为源的中转信息头文件中的SDP为源的中转信息类结构中:
增加SDPOutputInfo类结构指针成员变量;
将读取前述设计的SDP文件存放进字符串类型成员变量中;
增加获取SDPOutputInfo指针数组的函数,用于获取指定数组下标的SDPOutputInfo指针数组成员返回当前SDPOutputInfo数据成员地址;
增加开辟中转信息结构体数组函数,该函数用于根据前述配置文件或者数据库中获取的中转目的数量开辟SDPOutputInfo结构数组;
增加解析SDP中转目的的函数,该函数用于通过解析配置文件或者数据库数据统计出中转目的数提供给开辟中转信息结构体数组函数进行中转目的数组数量的开辟,然后继续解析Announce的IP地址和端口;
增加解析以SDP为源的Announce指令地址的函数,该函数用于提供给解析SDP中转目的的函数进行调用以解析汇聚服务器中转过程中发往中转目的的RTSP交互指令的目的IP和端口;
步骤五、通过步骤一至四备好以SDP为源进行中转的必要信息之后,原有达尔文流媒体服务器将首先根据SDP中转源信息类创建中转会话,接着以这个中转会话作为流媒体信息交互的会话单位创建媒体流转发目的子会话,此时修改原达尔文流媒体服务器中添加中转任务进中转队列的函数中最后一个参数为true;
步骤六、在步骤五调用了添加中转任务进中转队列的函数之后,开始创建中转输出(RelayOutput)任务,且以SDP为源的信息(RelaySDPSourceInfo)作为创建依据,SDP为源的信息中SDPOutputInfo结构体包含创建中转会话的必要元素;
步骤七、中转任务发送Announce指令中负载的SDP信息时设置音视频媒体流的属性字段a=sendonly,表明当前任务为发送音视频媒体流,同时m=video字段中的端口号表示发送端口号;
步骤八、将原达尔文流媒体服务器框架中的以RTSP为源的中转信息结构体为参数创建中转对象方法,修改成根据SDPOutputInfo为参数创建中转信息对象方法。
2从1,在所述步骤一中,在第二个字段之后可以再跟多个IP地址表示由第一个IP地址的汇聚服务器中转出来的数据流要中转的目的地址,同时,中转目的地址也可采用组播地址。
3从1,在所述步骤三种,增加的中转信息类结构包括:是否进行中转宣告,宣告目的IP地址,宣告目的端口,宣告唯一标识符,宣告目的身份验证用户名,宣告目的身份验证密码以及用于比较两个类结构是否相等的比较函数,所述宣告唯一标识符也是作为码流唯一标识符。
与现有技术相比,本发明的积极效果在于:
1):现有国标GB/T28181通过SIP(会话初始协议)信令触发前端摄像机设备进行媒体流播放是P2P(点对点)方式,无法实现一路码流多路转发播放的目的,本发明通过汇聚前端设备数据流,实现多路转发;
2):现有国标GB/T28181方案在前端设备和后端接入之间使用P2P(点对点)方式进行交互,使得前端设备完全暴露在用户之间,安全性完全无法保证,本发明通过汇聚服务器在汇聚媒体数据流进行中转的情况下同时也起到了对前端设备和后端接入之间的安全隔离;
3):现有GB/T28181方案使用20位数字长度进行设备编号,访问容易出错,非常晦涩,本发明提出的方案通过汇聚服务器以及对媒体流进行唯一字符编码,使得能够通过DNS(域名解析)的方式清晰,方便的进行访问位于GB/T28181域内的设备;
4):现有GB/T28181在最新版本2016版本中没有对媒体数据流的QoS机制进行描述,因此在整个GB28181协议体系下的系统运行媒体流发送端到媒体流接收端之间的网络质量的流量控制很难保证;本发明通过汇聚服务器统一进行媒体流分发,提供网络QoS机制,流量控制机制,保证网络带宽质量。
另外,本发明还基于原达尔文流媒体服务器框架修改原先SDP作为源的中转模式下仅仅只中转媒体数据的方式,修改成使用RTSP(实时流媒体协议)Announce(宣告)指令的方式实现对数据流进行唯一标识。
以下结合附图和具体实施例对本发明作进一步详述。
附图说明
图1为现有中转单播方式的的流程图;
图2是本发明GB28181媒体流汇聚转发的流程图。
具体实施方式
如图2所示,本发明一种GB28181媒体流汇聚转发的方法,具体包括如下步骤:
步骤一、基于达尔文流媒体服务器平台中具备的原有功能(读取SDP文件,根据SDP中描述的信息启动流媒体接收),通过读取SDP(会话描述协议)文件中转媒体数据流方式设计SDP文件,设计步骤包括:
①、对于国标GB/T28181协议中常用的数据流打包格式PS(Program Stream)流方式,将SDP文件中的视频属性字段集合中描述流结构的字段写成: a=rtpmap:96 MP2P/90000,a=rtpmap为固定格式,96为负载类型,MP2P为编码类型,90000为时钟频率;
②、接着上一行a=rtpmap:96 MP2P/90000,设计a=fmtp:96,其中a=fmtp为固定格式,96为负载类型;
③、基于达尔文流媒体服务器作为读取SDP方式下的接收中转,增加达尔文流媒体服务器特有的属性字段格式a=x-qt-relay-addr, a=x-qt-relay-port,其中a=x-qt-relay-addr字段表示中转目的,该字段后面跟着第一个IP地址为接收媒体数据流的地址,即为汇聚服务器的IP地址,第二个字段为转发目的IP地址,即为反射服务器IP地址,在第二个字段之后可以再跟多个IP地址表示由第一个IP地址的汇聚服务器中转出来的数据流要中转的目的地址,同时,中转目的地址也可采用组播地址;在中转地址列表之后的最后一个数字表示TTL(Time to Live存活时间)值,TTL值表示在UDP(用户数据报协议)传输方式下数据包经过几跳路由器会被抛弃的数值;所述a=x-qt-relay-port字段有两行,分别表示视频媒体数据端口和音频媒体数据端口,在这个前提下达尔文流媒体服务器将自动将每条媒体端口加一作为网络控制协议端口;a=x-qt-relay-addr示例如下: a=x-qt-relay-addr192.168.241.5 228.4.5.6 5 ,表示汇聚服务器接收地址为192.168.241.5,汇聚之后转发到228.4.5.6这个组播地址,如果经历5次路由器跳转则抛弃数据包。
④、根据RTSP(流媒体传输协议),在UDP传输方式下传输音视频码流,每条码流将占用一对端口,每对端口中RTP(媒体数据)为偶数端口,RTCP(网络控制协议)为奇数端口;
步骤二、基于达尔文流媒体服务器原有配置文件设置读取SDP文件(relayconfig.xml)的中转(Relay)配置或者通过数据库方式进行读取配置;
若通过读取SDP方式中转的配置,除指明SDP文件存放的位置信息,还通过增加announced_destination属性配置字段,指明汇聚服务器接收到前端设备发送过来的码流之后要通过ANNOUNCE(宣告)指令发送到哪一个目的,并且通过ANNOUNCE指令对码流进行唯一标识;
步骤三、基于达尔文流媒体服务器框架在SDP为源的中转信息头文件(RelaySDPSourceInfo.h)中增加SDPOutputInfo(SDP为源头的中转信息)类结构;增加的中转信息(SDPOutputInfo)类结构包括:是否进行中转宣告(fIsAnnounced),宣告目的IP地址(fAnnounceIP),宣告目的端口(fAnnouncePort),宣告唯一标识符(fDestURL,),宣告目的身份验证用户名(fUserName),宣告目的身份验证密码(fPassword成员变量)以及用于比较两个类结构是否相等的比较函数(Equal()函数),所述宣告唯一标识符也是作为码流唯一标识符;所述Equal()函数即用于比较两个SDPOutputInfo类结构是否相等,函数实现为判断fIsAnnounced,fAnnounceIP,fAnnouncePort,fDestURL这四个成员变量是否相等。
步骤四、在SDP为源的中转信息(RelaySDPSourceInfo.h)头文件中的SDP为源的中转信息(RelaySDPSourceInfo)类结构中:
增加SDPOutputInfo(SDP为源头的中转信息)类结构指针成员变量;
将读取前述设计的SDP文件存放进(LocalSDP)字符串类型成员变量中;
增加获取SDPOutputInfo指针数组的函数(GetSDPOutputInfo()函数),用于获取指定数组下标的SDPOutputInfo指针数组成员返回当前SDPOutputInfo数据成员地址;
增加开辟中转信息结构体数组函数(AllocateOutputArray()函数),该函数用于根据前述配置文件或者数据库中获取的中转目的数量开辟SDPOutputInfo结构数组;
增加解析SDP中转目的的函数(ParseSDPRelayDestination()函数),该函数用于通过解析配置文件或者数据库数据统计出中转目的数提供给开辟中转信息结构体数组函数进行中转目的数组数量的开辟,然后继续解析Announce的IP地址和端口;
增加解析以SDP为源的Announce指令地址的函数(ParseSDPAnnouncedDestination()函数),该函数用于提供给解析SDP中转目的的函数(ParseSDPRelayDestination()函数)进行调用以解析汇聚服务器中转过程中发往中转目的(即接收服务器)的RTSP交互指令的目的IP和端口;
步骤四主要目的在原有达尔文流媒体服务器基础上的RelaySDPSourceInfo类结构中增加了SDPOutputInfo数组指针,提供给媒体流数据中转开始时候的RTSP(实时流媒体协议)指令交互IP地址和端口。
步骤五、通过步骤一至四备好以SDP为源进行中转的必要信息之后,原有达尔文流媒体服务器将首先根据SDP中转源信息类创建中转会话,接着以这个中转会话作为流媒体信息交互的会话单位创建媒体流转发目的子会话,此时修改原达尔文流媒体服务器中添加中转任务进中转队列的函数(AddOutput()函数)中最后一个参数为true(真);表示该中转任务是需要进行RTSP(实时流媒体协议)中转的任务,而不仅仅是媒体数据的中转。
步骤六、在步骤五调用了添加中转任务进中转队列的函数之后,开始创建中转输出(RelayOutput)任务,且以SDP为源的信息(RelaySDPSourceInfo)作为创建依据,SDP为源的信息中SDPOutputInfo结构体包含创建中转会话的必要元素;现有的达尔文流媒体服务器框架在创建中转输出任务是以RTSPSourceInfo(媒体流设备源信息)作为依据创建;
步骤七、中转任务发送Announce(宣告)指令中负载的SDP信息时设置音视频媒体流的属性字段a=sendonly,表明当前任务为发送音视频媒体流,同时m=video字段(包含媒体流描述字段)中的端口号表示发送端口号,例如m=video 10000表示视频数据发送端口号为10000,而接收服务器中的接收端口号将通过中转任务AnnouncerTask进行协商确定,不需要人工干预;
步骤八、将原达尔文流媒体服务器框架中的以RTSP为源的中转信息结构体(RTSPSourceInfo)为参数创建中转对象的方法,修改成根据SDPOutputInfo(SDP为源的中转信息结构体)为参数创建中转信息对象的方法。
以上所述仅为本发明的优选实施例,并非对本案设计的限制,凡依本案的设计关键所做的等同变化,均落入本案的保护范围。