一、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版权协议,转载请附上原文出处链接和本声明。