最近有接觸到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();