GBT28181中的RTP

国标中说h264数据按照RFC3984打包,但是国标的测试工具——SPVMN,却不支持RFC3984的打包方式。

无奈之下直接用RFC3550的方式打包,其实就是分包,然后加上RTP头,对于一帧的结束,在RTP头中把MARK置1,并且在一帧的开始把时间戳增加而已。

这种打包方式其实和RFC有冲突,打包处理的RTP数据用VLC播放解码不正常,但用SPVMN是可以播的。

这种方式下没有测试音视频混合的情况,待测。

上代码(代码不全,体现下流程和重点):

int NewRTPPacket(unsigned short channel, unsigned short sequenceNumber, unsigned long timeStamp, RTSP_DATE_TIME time, \
				 const unsigned char *pRTPData, unsigned long dataLen, bool bIsKeyFrame, bool mark)
{
	if (dataLen > MAX_RTP_PAYLOAD_DATA_LEN)
	{
		assert(false);
		return -1;
	}
	m_Sec = time.seconds;
	m_MicroSec = time.microsecond;
	Clear();

	m_bIsKeyFrame = bIsKeyFrame;
	m_channel = channel;
	m_pRTPHeader->sequenceNumber = htons(sequenceNumber);
	m_pRTPHeader->timeStamp = htonl(timeStamp);

	m_rtpDataLen = dataLen + sizeof(RTP_HEADER);

	CreateCommonInfo(RTP_PAYLOAD_TYPE_H264, mark, STREAM_LIVE_VIDEO);

	memcpy(m_pRTPData + sizeof(RTP_HEADER) + sizeof(INTERLEAVED_INFO), pRTPData, dataLen);
}

int CreateRFC3550Packet(unsigned short channel, const unsigned char *pRTPData, unsigned long dataLen, bool bIsKeyFrame, unsigned long TimeStamp, bool mark)
{
	CRTPPacket *pRTPPacket = m_mapRTPPacketFree[channel]->front();
	m_mapRTPPacketFree[channel]->pop_front();

	pRTPPacket->NewRTPPacket(channel, ++m_VSequenceNum[channel], TimeStamp, \
		RTSPGetCurrTime(), pRTPData, dataLen, bIsKeyFrame, mark);

	m_mapRTPPacket[channel]->push_back(pRTPPacket);
	DistributePacket(pRTPPacket, channel);

	return 0;
}


//pData是一帧数据的首地址,dataLen是该帧的长度
	while(dataLen > 0)
	{
		if (dataLen > MAX_RTP_PAYLOAD_DATA_LEN)
		{
			CreateRFC3550Packet(channel, pData, MAX_RTP_PAYLOAD_DATA_LEN, bIsKeyFrame, m_LastFrameTs[streamType][channel], false);
			dataLen -= MAX_RTP_PAYLOAD_DATA_LEN;
			pData += MAX_RTP_PAYLOAD_DATA_LEN;
		}
		else
		{
			CreateRFC3550Packet(channel, pData, dataLen, bIsKeyFrame, m_LastFrameTs[streamType][channel], true);
			dataLen = 0;
			pData = NULL;
		}
	}

值得一提的是,时间戳增量并不一定要严格按照固定的值增长,比如:

帧率为25帧的视频数据,时间戳增量一般为3600,但是实际的帧率可能是动态的,上一帧的时间和下一帧的时间间隔可能不是严格的40ms,实际上也不可能这么严格,

那么我在打时间戳的时候可以把这一帧的时间戳打成3500的增量,再把下一帧的增量达成3700,这也没关系。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值