使用TCP传输RTP包,GB28181-2016和GB28181-2022 都是按IETF RFC4571来的。使用TCP发送RTP包,前面加个16位无符号长度字段就好(网络字节序)。具体定义格式如下:
需要注意的是LENGTH值可以是0,0的话表示空包; 另外UDP传输RTP包,整个RTP包的长度一般就1000多个字节。TCP的话,LENGTH最大可以到0xFFFF, 对于视频帧或PS包可以考虑把RTP包切的大一点,这样可以少传一些RTP包头(RTP Header至少12个字节)。
SDP也要做相应调整.
媒体行定义如下(m=):
"m=" media SP port ["/" integer] SP proto 1*(SP fmt) CRLF
其中<proto>值为:"TCP/RTP/AVP"
"setup" 属性:
"setup"属性值有:{ "active" , "passive"};
a=setup:active 表示主动发起连接.
a=setup:passive 表示被动accept连接.
给出一个安卓端发起连接的SDP例子:
v=0
o=31020000011310000027 0 0 IN IP4 192.168.0.107
s=Play
c=IN IP4 192.168.0.107
t=0 0
m=video 15012 TCP/RTP/AVP 96
a=rtpmap:96 PS/90000
a=setup:active
a=connection:new
a=sendonly
y=0200000001
GB/T 28181 附录中给出了基于TCP协议的音视频媒体传输描述,相对于GB/T 28181-2016, GB/T 28181-2022增加了TCP客户端首次连接重连机制要求,如果首次TCP连接失败,需要尝试重连接,重连必须间隔一段时间再尝试(间隔时间应不小于1秒), 至少要尝试重连3次以上。
首次重连机制,我自己的代码已经加上了, 接口如下:
/*
* Copyright (C) 1130758427@qq.com. All rights reserved.
*/
/**
* 设置国标TCP连接超时时间
*
* @param timeout_ms, 单位是毫秒, 必须大于0, 不设置的话SDK将用默认值
* @return {0} if successful
*/
public native int SetGBTCPConnectTimeout(long handle, int timeout_ms);
/**
* GB/T 28181-2022 附录D: TCP流媒体传输时, 首次TCP连接失败时, 应间隔一段时间进行重连, 重连间隔应不小于1秒, 此接口设置首次重连间隔时间
*
* @param interval_ms, 单位是毫秒, 必须大于等于0, SDK默认值是1000毫(1秒)
* @return {0} if successful
*/
public native int SetGBInitialTCPReconnectInterval(long handle, int interval_ms);
/**
* GB/T 28181-2022 附录D: TCP流媒体传输时, 首次TCP连接失败时, 应间隔一段时间进行重连,重连次数应不小于3次, 此接口设置首次最大重连次数
*
* @param attempts, 最大重连次数, 必须大于等于0, SDK默认值是0, 如果对接的是GB/T 28181-2022 server,建议设置为3或更大的值
* @return {0} if successful
*/
public native int SetGBInitialTCPMaxReconnectAttempts(long handle, int attempts);
GB28181-2022 相对于2016有些调整,基于国标的安卓执法记录仪要对接2022版服务端的话,代码也做相应调整更新, 更多问题可以联系qq: 1130758427