gb28181要求在sdp中传输ssrc,意味着jrtp中的ssrc需要我们自己设置,调用接口:
RTPSessionParams sessparams;
sessparams.SetOwnTimestampUnit(1.0 / 9000.0);
sessparams.SetUsePredefinedSSRC(true);
uint32_t ssrc = 999999999;
sessparams.SetPredefinedSSRC(ssrc );
我在invite发起端和接收端都设置了相同的ssrc,然后困扰我两天的问题来了。
rtp数据总是不全,通过wireshark抓包接收方网卡数据接收完整,意味着数据是在jrtp内部丢掉的,最明显的是第一帧的第一片必丢(OnPollThreadStep传来的数据)。
然后只能跟调源码啦。。。(问题解决方法很简单,不要在invite发送方设置ssrc或者设置的ssrc与invite接收方不同,后面内容是源码调试)
RTP包的接收入口函数 :
int RTPUDPv4Transmitter::PollSocket(bool rtp)
{
...
rawpacketlist.push_back(pack);
...
return 0;
}
RTP包的处理函数
int RTPSession::Poll()
{
int status;
if (!created)
return ERR_RTP_SESSION_NOTCREATED;
if (usingpollthread)
return ERR_RTP_SESSION_USINGPOLLTHREAD;
if ((status = rtptrans->Poll()) < 0)
return status;
return ProcessPolledData();
}
发现jrtp内部确实接收到了所有数据,在后续的处理中丢掉了,然后一直跟调,发现在和ssrc有关系,尝试不在invite方设置ssrc,问题出乎意料地解决了。