利用Jrtplib转发rtp包

本文介绍了一种基于GB28181标准的RTP包转发实现方案,通过使用jrtplib库进行摄像机流媒体的接收与转发。具体涉及了如何设置RTP会话参数、调整缓冲区大小、指定目标地址等关键步骤。

最近有接触到GB28181,涉及到ps格式媒体的rtp包转发,就是摄像机推流到流媒体服务器,流媒体服务器再利用jrtplib库将流转发给客户端,下面给出单路转发的相关代码,

jrtplib版本是3.9.1。

	RTPSession session;
	WSADATA dat;
	WSAStartup(MAKEWORD(2, 2), &dat);
	RTPSessionParams sessionparams;
	sessionparams.SetOwnTimestampUnit(1.0 / 8000.0);
	RTPUDPv4TransmissionParams transparams;
	transparams.SetPortbase(6000);
	int oldBufSize = transparams.GetRTPReceiveBuffer();
	transparams.SetRTPReceiveBuffer(oldBufSize * 2);
	int status = session.Create(sessionparams, &transparams);
	int newBufSize = transparams.GetRTPReceiveBuffer();
	int oldBufSizec = transparams.GetRTCPReceiveBuffer();
	transparams.SetRTCPReceiveBuffer(oldBufSizec * 2);
	int newBufSizec = transparams.GetRTCPReceiveBuffer();
	
	BYTE *pfBuffer;
	BYTE *pBuffer;
	uint32_t destip;

	destip = ntohl(inet_addr("192.168.1.201"));
	RTPIPv4Address addr(destip, 7000);

	session.AddDestination(addr);
	session.SetDefaultPayloadType(96);
	session.SetDefaultMark(false);
	session.SetDefaultTimestampIncrement(160);
	while (g_RTPThreadRun)
	{
		
		session.BeginDataAccess();
		if (session.GotoFirstSourceWithData())
		{
			do
			{
				RTPPacket *pack;

				while ((pack = session.GetNextPacket()) != NULL)
				{
					
					int nLen = pack->GetPayloadLength();
			
					pfBuffer = (unsigned char*)pack->GetPayloadData();
					pBuffer = new BYTE[nLen + 1];
					memcpy(pBuffer, pfBuffer, nLen);
					pBuffer[nLen] = 0;
				
					session.SendPacket((void *)pBuffer, nLen);
			
					session.DeletePacket(pack);
				}
			} while (session.GotoNextSourceWithData());
		}
		session.EndDataAccess();
		session.Poll();
		Sleep(1);
	}
	session.Destroy();
	WSACleanup();


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值