jrtplib开源库系列之二:jrtplib库example1分析说明

简介: 这个官方example还是比较简单的,主要是测试发一个数据包,然后自己接收发出的包,注意,这里需要注意将目的地址的端口和基端口(portbase)设置为相同,同时需要将这个参数设置为真sessparams.SetAcceptOwnPackets(true);

源代码

void checkerror(int rtperr)
{
  if (rtperr < 0)
  {
  std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
  exit(-1);
  }
}
//
// The main routine
//
int main(void)
{
#ifdef RTP_SOCKETTYPE_WINSOCK
  WSADATA dat;
  WSAStartup(MAKEWORD(2,2),&dat);
#endif // RTP_SOCKETTYPE_WINSOCK
  RTPSession sess;
  uint16_t portbase,destport;
  uint32_t destip;
  std::string ipstr;
  int status,i,num;
  std::cout << "Using version " << RTPLibraryVersion::GetVersion().GetVersionString() << std::endl;
  // First, we'll ask for the necessary information
  std::cout << "Enter local portbase:" << std::endl;
  std::cin >> portbase; //设置端口
  std::cout << std::endl;
  std::cout << "Enter the destination IP address" << std::endl;
  std::cin >> ipstr;
  destip = inet_addr(ipstr.c_str());
  if (destip == INADDR_NONE)
  {
  std::cerr << "Bad IP address specified" << std::endl;
  return -1;
  }
  // The inet_addr function returns a value in network byte order, but
  // we need the IP address in host byte order, so we use a call to
  // ntohl
  destip = ntohl(destip);//转换为主机地址序
  std::cout << "Enter the destination port" << std::endl;
  std::cin >> destport;//设置目的地址的端口,如果测试自己给自己发送的包,请和portbase设置一致
  std::cout << std::endl;
  std::cout << "Number of packets you wish to be sent:" << std::endl;
  std::cin >> num;
  // 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)
  //在其他应用中,必须设置这个参数,比如使用RTP协议传输H264,这里必须设置为1/90000,关于如何使用RTP传输H264,请参考RFC3984协议规范
  sessparams.SetOwnTimestampUnit(1.0/10.0); 
  sessparams.SetAcceptOwnPackets(true);//注意,如果想测试自己调用自己发送的包,需要设置为true
  transparams.SetPortbase(portbase);
  status = sess.Create(sessparams,&transparams);  
  checkerror(status);
  RTPIPv4Address addr(destip,destport);
  status = sess.AddDestination(addr);
  checkerror(status);
  for(int i = 0; i < num; ++i)
  {
  // send the packet
  status = sess.SendPacket((void *)"1234567890",10,0,false,10);
       checkerror(status);
    //由于可能使用多线程,需要保证数据源数据在多线程下是安全的
    //用户在获取其他数据源发送数据之前需要调用这个接口
    //在调用完成之后需要调用EndDataAccess()接口
  sess.BeginDataAccess();
  // check incoming packets
  if (sess.GotoFirstSourceWithData()) //判断是否有其他数据源发送的数据
  {
    do
    {
    RTPPacket *pack;
    while ((pack = sess.GetNextPacket()) != NULL)
    {
      // You can examine the data here
      printf("Got packet !\n");
      // 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;
}

代码说明

这个官方example还是比较简单的,主要是测试发一个数据包,然后自己接收发出的包,注意,这里需要注意将目的地址的端口和基端口(portbase)设置为相同,同时需要将这个参数设置为真sessparams.SetAcceptOwnPackets(true);


相关文章
jrtplib开源库系列之一:jrtplib介绍、安装和测试(window 10环境介绍)
关于jrtplib库网上已经有很多介绍,而且目前jrtplib作者已经停止更新(Apr 18, 2020),最新版本为v3.11.2。本系列内容也以该版本进行介绍。 相信你已经对RTP/RTCP协议有一定的了解,并想更深入的了解RTP协议的具体实现,jrtplib就是使用使用C++实现的RTP/RTCP协议。具体标准为RFC3550,如果想仔细阅读原文,但是对英文又有点吃力,可以参考我的博客RTP/RTCP中英文对照,在博客的后面有百度链接,是对RFC3550的中文翻译,可能很多地方不太准确,有些内容是自己添加进去的,希望不会影响你的阅读。
335 0
|
存储 安全 Unix
/var/log/messages说明
【4月更文挑战第5天】`/var/log/messages`是类Unix系统(包括Linux)的日志文件,存储系统启动、关闭、内核消息、服务状态和服务错误等信息。内容可能因配置和日志系统(如syslog、rsyslog、journald)不同而变化。现代Linux可能使用`journalctl`等工具访问journald日志,提供更强大管理功能。
2011 1
/var/log/messages说明
|
Java Linux Shell
Linux安装部署Nacos
从头到尾的教程以及解决安装中可能遇到的问题
647 0
Linux安装部署Nacos
|
存储 编解码 监控
VOS3000作用与功能
VOS3000是一套VoIP 运营支撑系统,系统拥有强大的功能集合及可靠的安全保障,可支撑 5000 路并发,适用于话务转发,企业终端,APP 业务,大型呼叫中心调度等多种业务形态,满足了大部分高并发大容量 VoIP 业务的需求。
2870 0
|
编解码 openCL TensorFlow
RK3568开发笔记(一):瑞芯微RK3568芯片介绍,入手开发板的核心板介绍
RK3568开发笔记(一):瑞芯微RK3568芯片介绍,入手开发板的核心板介绍
RK3568开发笔记(一):瑞芯微RK3568芯片介绍,入手开发板的核心板介绍
|
存储 编解码 算法
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换(一)
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换
1182 1
|
API 数据安全/隐私保护
jrtplib开源库系列之三:jrtplib发送接收数据流程
前面2篇文章主要说明了如何安装jrtplib库,以及对example1进行了说明,这篇文章主要说下jrtplib库数据的收发流程。
757 0
|
编解码 Linux
libfdk-aac和x264安装编译
libfdk-aac和x264安装编译
675 0
libfdk-aac和x264安装编译
|
数据可视化
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Date/Time Edit的使用及说明
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Date/Time Edit的使用及说明
1483 2
|
Windows
Qt实现telnet服务【记录】
Qt实现telnet服务【记录】
617 0