Jrtp的简单应用,以及内存泄漏的问题。

工程发生了内存泄漏,排查许久发现是jrtp传输的问题。 在此备份一下,以共勉。

接收端代码段:

int main(void)
{
#ifdef RTP_SOCKETTYPE_WINSOCK
	WSADATA dat;
	WSAStartup(MAKEWORD(2, 2), &dat);
#endif // RTP_SOCKETTYPE_WINSOCK

	RTPSession sess;
	uint16_t portbase;
	int status, i, num;

	cout << "Using version " << RTPLibraryVersion::GetVersion().GetVersionString() << endl;
	cout << "Enter local portbase:" << endl;
	cin >> portbase;
	cout << endl;

	// Now, we'll create a RTP session, set the destination, send some
	// packets and poll for incoming data.

	RTPUDPv4TransmissionParams transparams;
	RTPSessionParams sessparams;

	// IMPORTANT: The local timestamp unit MUST be set, otherwise
	//            RTCP Sender Report info will be calculated wrong
	// In this case, we'll be sending 10 samples each second, so we'll
	// put the timestamp unit to (1.0/10.0)

	sessparams.SetOwnTimestampUnit(1.0 / 10.0);
	sessparams.SetAcceptOwnPackets(true);
	transparams.SetPortbase(portbase);
	status = sess.Create(sessparams, &transparams);

	checkerror(status);

	while (1)
	{
		sess.BeginDataAccess();
		// check incoming packets
		if (sess.GotoFirstSourceWithData())
		{
			do
			{
				RTPPacket *pack;
				while ((pack = sess.GetNextPacket()) != NULL)
				{
					// You can examine the data here
					cout << "Got packet !" << endl;
					cout << pack->GetPayloadData() << endl;
					// we don't longer need the packet, so
					// we'll delete it
					sess.DeletePacket(pack);
				}
			} while (sess.GotoNextSourceWithData());
		}
		sess.EndDataAccess();

#ifndef RTP_SUPPORT_THREAD
		status = sess.Poll();
		checkerror(status);
#endif // RTP_SUPPORT_THREAD

		RTPTime::Wait(RTPTime(1, 0));
	}
	sess.BYEDestroy(RTPTime(10, 0), 0, 0);

#ifdef RTP_SOCKETTYPE_WINSOCK
	WSACleanup();
#endif // RTP_SOCKETTYPE_WINSOCK

	return 0;
}

问题一:
GetNextPacket()和DeletePacket()必须配对使用。
如果只GetNextPacket()而不DeletePacket(),发送端不断地发送数据,接收端就会不断地发生内存泄漏。

问题二:

while (1)
{
	//		sess.BeginDataAccess();
	//		// check incoming packets
	//		if (sess.GotoFirstSourceWithData())
	//		{
	//			do
	//			{
	//				RTPPacket *pack;
	//				while ((pack = sess.GetNextPacket()) != NULL)
	//				{
	//					// You can examine the data here
	//					cout << "Got packet !" << endl;
	//					cout << pack->GetPayloadData() << endl;
	//					// we don't longer need the packet, so
	//					// we'll delete it
	//					sess.DeletePacket(pack);
	//				}
	//			} while (sess.GotoNextSourceWithData());
	//		}
	//		sess.EndDataAccess();
	//
	//#ifndef RTP_SUPPORT_THREAD
	//		status = sess.Poll();
	//		checkerror(status);
	//#endif // RTP_SUPPORT_THREAD
	//
	//		RTPTime::Wait(RTPTime(1, 0));
}

如果将线程里的循环全都注释让线程空跑,当发送端发送数据时,接收端依然会不断地发生内存泄漏。深层原因需要钻研jrtp源码,懒得看了,如果有同胞发现原因。望告知

程序代码:
https://download.csdn.net/download/qq_25359343/11461800

参考:
https://blog.csdn.net/wastedsoul/article/details/80581864

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: jrtplib是一个开源的RTP协议实现库,用于音视频数据传输。这个库提供的接口简单易用,开发人员可以利用它来开发音视频传输应用程序。 jrtplib支持RTP传输协议和RTCP控制协议,可以将音视频数据封装成RTP数据包进行传输,并在传输过程中进行丢包重传等错误处理,保证音视频数据的稳定传输。而RTCP协议则用于对RTP传输质量进行监控和统计,以及发送SRTCP密钥。 使用jrtplib进行音视频传输需要在程序中完成如下步骤: 1. 创建RTPSession对象,并设置传输参数,如IP地址、端口号等。 2. 创建RTPSession的发送端或接收端,设置对应的传输信息,如发送目标地址和端口号等。 3. 对于发送端,可以调用RTPSession的SendPacket函数,将音视频数据分片封装为RTP数据包,并发送到接收端。对于接收端,需要调用RTPSession的Poll函数,从接收缓存中读取RTP数据包,并进行解封装,得到原始的音视频数据。 4. 在传输过程中,可以根据需要进行丢包重传、重组分片等错误处理,以保证数据传输的正确性和稳定性。 总之,jrtplib为音视频传输程序提供了一个开源的高效实现框架,可以快速开发出稳定可靠的音视频传输应用。 ### 回答2: jrtp是一个C++的库,用于实现实时传输协议(RTP)和实时控制协议(RTCP)。该库提供了对媒体流传输的支持和管理,可以使用该库来开发各种实时应用程序,比如音视频会议、实时监控和直播等,具有很好的移植性和可扩展性。 jrtp库中包含了发送和接收RTP数据包的相关函数,可以直接用于实现视频或音频数据的传输,也可以通过修改代码实现其他数据类型的传输。其中,发送函数主要是构建RTP数据包并发送,接收函数主要是接收数据包并分析出其中的媒体信息,解析出的信息可以用于视频或音频的播放和处理。 jrtplib还提供了一些可选的功能,比如RTCP报告(用于数据传输质量的反馈)、NAT穿透、数据压缩、数据加密等,可以根据具体需求进行调用。 除此之外,jrtp还提供了一些示例程序和API文档,让开发者快速上手,更快地完成实时传输应用的开发工作。总的来说,jrtplib是一个开源、灵活、功能强大的实时传输库,可以帮助开发人员构建高效的实时应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值