GBT28181协议规定码流使用RTP包负载,推荐为PS流,也可以是ES流,可以是UDP传输,也可以是TCP(2016版),TCP分发送端active和passive,取流的SDP信令中加 TCP/ 字段,并附加a=connection:new和a=setup:active(passive)字段,invite消息和响应消息的SDP中a=setup:active/passive相反,注意平台级联时ssrc由下级平台指定,设备接入由接入平台指定。
TCP传输是需要在RTP包前加两个字节表示RTP包长度(网络序,数值不包含这两个字节)。
接收RTP流有两种模式,第一种是只绑定一个主机端口,所有相机流通过这个端口接收,接收后根据ssrc区分数据属于哪路流再组帧。第二种是为每路流分配不同的端口接收,一个端口收到的所有流都是同一路。
第一种模式:
优点:容易实现,占用服务器端口资源少,如果服务器映射到公网工作,只需映射收流端口和它+1的端口(用着rtcp保活)即可,方便实施。
缺点:由于国标的取流信令ssrc传递是在SDP协议中添加y字段表示,并不是SDP标准,sip消息在经过某些交换机时,交换会按SDP标准将字段去掉,导致ssrc值传递失败,这个收流模式完全不能使用,只能用第二种方式收流。
第二种模式:
优点:弥补第一种的致命缺点。
缺点:需要分配和监听很多端口,映射到公网上时麻烦,如果可用端口量不是很多,取流时如果某个相机关流异常,导致不断的发流到这个端口(假设没用到rtcp保活),下次分配这个端口收流时会造成串流现象。
总结:第一种受网路传y字段的限制,如果国标在定义传统ssrc值时用a=ssrc:0100123这样的方式,就不会被截断了。
注意:SDP中v=/o=/s=这些字段顺序不能乱,是否有规定不知道,反正乱了对接某些厂家会有问题。