rtp的tcp配置

一、rtp传输协议,我使用的是jrtplib库,一般情况传输音视频数据都采用udp模式,但在gb28181协议中有时会使用tcp模式。在jrtplib库中我没有找到封装好的tcp传输设置。

1、udp模式rtp配置。

	RTPSessionParams sessparams;
	sessparams.SetOwnTimestampUnit(1.0 / 90000.0);
	sessparams.SetMaximumPacketSize(1500);
	
	RTPUDPv4TransmissionParams transparams;
	transparams.SetPortbase(8888);
	
	RTPSession session;
	//创建本地rtp会话session
	session.Create(sessparams, &transparams);

	//数据接收端设置
//	uint8_t localip[] = { 127,0,0,1 };
	unsigned long destip;

	destip = inet_addr("192.168.0.121");
	if (destip == INADDR_NONE) {
		printf("Bad IP address specified.\n");
		return 0;
	}

	destip = ntohl(destip);
	RTPIPv4Address addr(destip, 10016);

	session.AddDestination(addr);
	// 设置RTP会话默认参数
	session.SetDefaultPayloadType(96);
	session.SetDefaultMark(false);
	session.SetDefaultTimestampIncrement(90000.0 / 25);

2、tcp(被动)模式rtp配置。

	RTPSessionParams sessparams;
	sessparams.SetOwnTimestampUnit(1.0 / 90000.0);
	sessparams.SetMaximumPacketSize(1500);

	RTPSession session;
	
	RTPAbortDescriptors m_descriptors;
	RTPTCPTransmissionParams transparams;

	m_descriptors.Init();

	transparams.SetCreatedAbortDescriptors(&m_descriptors);
	int status = session.Create(sessparams,&transparams,RTPTransmitter::TCPProto);
	if(status < 0)
	{
		printf("Create error\n");
		return 0;
	}

	int socketFd = socket(AF_INET, SOCK_STREAM, 0);
	if(socketFd == -1)
	{
		printf("create socker failed\n");
		return 0;
	}
	struct sockaddr_in addrSrv, addrClt;
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(atoi(9536));
	addrSrv.sin_addr.s_addr = inet_addr("0.0.0.0");
	if(bind(socketFd, (struct sockaddr*)&addrSrv, sizeof(addrSrv)) < 0)
	{
		printf("can not bind listener socket\n");
		return -1;
	}

	listen(socketFd, 10);

	int ClientFd = accept(socketFd, 0, 0);
	if(ClientFd == -1)
	{
		printf("Can`t accept incoming connection\n");
		return -1;
	}

	RTPTCPAddress addr(ClientFd);
	status = session.AddDestination(addr);
	if(status < 0)
	{
		printf("[session.AddDestination]:%s\n" ,RTPGetErrorString(status).c_str());
		return 0;
	}
	
	// 设置RTP会话默认参数
	session.SetDefaultPayloadType(96);
	session.SetDefaultMark(false);
	session.SetDefaultTimestampIncrement(90000.0 / 25);

3、tcp(主动)模式rtp配置。

	RTPSessionParams sessparams;
	sessparams.SetOwnTimestampUnit(1.0 / 90000.0);
	sessparams.SetMaximumPacketSize(1500);

	RTPSession session;
	
	RTPAbortDescriptors m_descriptors;
	RTPTCPTransmissionParams transparams;

	m_descriptors.Init();

	transparams.SetCreatedAbortDescriptors(&m_descriptors);
	int status = session.Create(sessparams,&transparams,RTPTransmitter::TCPProto);
	if(status < 0)
	{
		printf("Create error\n");
		return 0;
	}

	int socketFd = socket(AF_INET, SOCK_STREAM, 0);
	if(socketFd == -1)
	{
		printf("create socker failed\n");
		return 0;
	}
	struct sockaddr_in addrSrv, addrClt;
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_addr.s_addr = inet_addr("192.168.0.120");
	addrSrv.sin_port = htons(atoi(10016));

	//连接服务器
	connect(socketFd, (sockaddr*)&addrSrv, sizeof(sockaddr));
	RTPTCPAddress addr(socketFd);
	status = session.AddDestination(addr);
	if(status < 0)
	{
		printf("[session.AddDestination]:%s\n" ,RTPGetErrorString(status).c_str());
		return 0;
	}
	
	// 设置RTP会话默认参数
	session.SetDefaultPayloadType(96);
	session.SetDefaultMark(false);
	session.SetDefaultTimestampIncrement(90000.0 / 25);

版权声明:本文为weixin_46840784原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。