jrtplib 发现丢包,怎么通知重新发送
时间: 2023-10-13 14:06:23 浏览: 70
当使用jrtplib进行数据传输时,如果发现数据包丢失,可以通过发送一个NACK(不确认)消息来通知发送方重新发送该数据包。发送NACK消息的方式可以通过使用RTCP协议中的REMB(Rapid Receiver Feedback)消息或者使用RFC4585中定义的基于RTCP的NACK消息来实现。具体实现方式可以参考jrtplib提供的API文档和示例代码。
相关问题
jrtplib 怎么检测是否丢包
jrtplib 是一个用于 RTP/RTCP 协议的 C++ 实现库,它提供了丰富的 API 用于 RTP 数据包的发送和接收。在 jrtplib 中,可以通过设置 RTPSession 的参数来检测是否丢包。具体来说,可以设置 RTPSession 的`SetAcceptOwnPackets(bool acceptOwnPackets)`和`SetMaximumPacketWaitTime(uint32_t maxWaitTime)`方法。其中,`SetAcceptOwnPackets`方法用于设置是否接收自己发送的 RTP 数据包,而`SetMaximumPacketWaitTime`方法用于设置等待接收 RTP 数据包的最大时间。如果在指定的时间内没有接收到 RTP 数据包,则可以认为发生了丢包现象。此外,jrtplib 还提供了 `RTPRawPacket` 类用于获取 RTP 数据包的详细信息,例如序列号等,以便更加准确地检测是否丢包。
jrtplib 发送ps
使用jrtplib发送PS流的步骤如下:
1. 初始化jrtplib库并创建一个RTPSession实例。
2. 设置RTPSession的传输协议类型为PS。
3. 设置RTPSession的传输模式为推送模式。
4. 设置RTPSession的远程地址和端口号。
5. 打开RTPSession。
6. 读取PS文件并将其分成小的NAL单元。
7. 将NAL单元打包成RTP包并发送到远程地址。
8. 关闭RTPSession。
代码示例:
```c++
#include <jrtplib3/rtpsession.h>
#include <jrtplib3/rtpudpv4transmitter.h>
#include <jrtplib3/rtpipv4address.h>
#include <jrtplib3/rtptimeutilities.h>
#include <iostream>
#include <fstream>
using namespace jrtplib;
using namespace std;
int main(int argc, char* argv[])
{
RTPSession session;
RTPUDPv4TransmissionParams transparams;
RTPSessionParams sessparams;
sessparams.SetOwnTimestampUnit(1.0/90000.0);
transparams.SetPortbase(8000);
int status = session.Create(sessparams,&transparams);
if (status < 0)
{
cerr << "ERROR: " << RTPGetErrorString(status) << endl;
return -1;
}
RTPIPv4Address addr("192.168.1.100", 9000);
status = session.AddDestination(addr);
if (status < 0)
{
cerr << "ERROR: " << RTPGetErrorString(status) << endl;
return -1;
}
session.SetDefaultPayloadType(96);
session.SetDefaultMark(false);
session.SetTimestampUnit(1.0/90000.0);
session.SetDefaultTimestampIncrement(3600);
status = session.InitSend();
if (status < 0)
{
cerr << "ERROR: " << RTPGetErrorString(status) << endl;
return -1;
}
ifstream fin("test.ps", ios::binary);
if (!fin.is_open())
{
cerr << "ERROR: cannot open file" << endl;
return -1; }
char nal[1024];
int nal_len = 0;
while (!fin.eof())
{
fin.read(nal + nal_len, 1024 - nal_len);
nal_len += fin.gcount();
char* p = nal;
while (nal_len > 0)
{
int len = 0;
while (len < nal_len && !(p[len] == 0x00 && p[len+1] == 0x00 && p[len+2] == 0x01))
len++;
if (len == nal_len)
{
break;
}
len += 3;
RTPTime delay(0.020);
session.SendPacket((void*)p, len, 96, false, delay);
p += len;
nal_len -= len;
}
}
fin.close();
session.BYEDestroy(RTPTime(10,0),0,0);
return 0;
}
```