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);


相关文章
|
2月前
|
Web App开发 编解码 安全
【WebRTC 入门教程】全面解析WebRTC:从底层原理到Qt和FFmpeg的集成应用
【WebRTC 入门教程】全面解析WebRTC:从底层原理到Qt和FFmpeg的集成应用
799 1
|
2月前
|
C++
jrtplib开源库系列之一:jrtplib介绍、安装和测试(window 10环境介绍)
关于jrtplib库网上已经有很多介绍,而且目前jrtplib作者已经停止更新(Apr 18, 2020),最新版本为v3.11.2。本系列内容也以该版本进行介绍。 相信你已经对RTP/RTCP协议有一定的了解,并想更深入的了解RTP协议的具体实现,jrtplib就是使用使用C++实现的RTP/RTCP协议。具体标准为RFC3550,如果想仔细阅读原文,但是对英文又有点吃力,可以参考我的博客RTP/RTCP中英文对照,在博客的后面有百度链接,是对RFC3550的中文翻译,可能很多地方不太准确,有些内容是自己添加进去的,希望不会影响你的阅读。
59 0
|
9月前
|
网络协议 Linux iOS开发
【100天精通python】Day40:GUI界面编程_PyQt 从入门到实战(完)_网络编程与打包发布
【100天精通python】Day40:GUI界面编程_PyQt 从入门到实战(完)_网络编程与打包发布
112 0
|
9天前
|
Linux
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist
《FFmpeg开发实战》书中介绍了直播的RTSP和RTMP协议,以及新协议SRT和RIST。SRT是安全可靠传输协议,RIST是可靠的互联网流传输协议,两者于2017年发布。腾讯视频云采用SRT改善推流卡顿。以下是Linux环境下为FFmpeg集成libsrt和librist的步骤:下载安装源码,配置、编译和安装。要启用这些库,需重新配置FFmpeg,添加相关选项,然后编译和安装。成功后,通过`ffmpeg -version`检查版本信息以确认启用SRT和RIST支持。详细过程可参考书中相应章节。
16 1
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist
|
1月前
|
编解码 Linux
FFmpeg开发笔记(二十八)Linux环境给FFmpeg集成libxvid
XviD是开源的MPEG-4视频编解码器,曾与DivX一起用于早期MP4视频编码,但现在已被H.264取代。要集成XviD到Linux上的FFmpeg,首先下载源码,解压后配置并编译安装libxvid。接着,在FFmpeg源码目录中,重新配置FFmpeg以启用libxvid,然后编译并安装。成功后,通过`ffmpeg -version`检查是否启用libxvid。详细步骤包括下载、解压libxvid,使用`configure`和`make`命令安装,以及更新FFmpeg配置并安装。
41 2
FFmpeg开发笔记(二十八)Linux环境给FFmpeg集成libxvid
|
2月前
|
API 数据安全/隐私保护
jrtplib开源库系列之三:jrtplib发送接收数据流程
前面2篇文章主要说明了如何安装jrtplib库,以及对example1进行了说明,这篇文章主要说下jrtplib库数据的收发流程。
140 0
|
XML 网络协议 Linux
POCO库的安装与基础知识说明
一、POCO简单介绍 POCO(Portable Components)是一个轻量级的 C++ 类库,提供了许多基本的、可移植的 C++ 组件和工具。它包含了很多模块,例如网络、XML、加密、多线程等等,可帮助 C++ 开发人员快速构建高效、可靠、可扩展的应用程序。 1.1 基本模块 Foundation:提供了许多基本的 C++ 类和函数,例如字符串、文件、日期时间、异常处理、日志等等。 Net:提供了网络编程的支持,包括 TCP、UDP、HTTP、HTTPS、SMTP、POP3、FTP、DNS 等等。 Util:提供了各种工具和辅助函数,例如配置文件、命令行解析、正则表达式、JS
484 0
|
前端开发 JavaScript 数据可视化
封装库/工具库中重要概念之实用工具库
在前端开发中,封装库和工具库是非常重要的。它们可以帮助我们提高开发效率,减少出错的机会,并且使得代码更加易于维护。在本文中,我们将探讨前端中一些实用的封装库和工具库。
72 0
|
存储 缓存 API
ASIHTTPRequest类库简介和使用说明
ASIHTTPRequest类库简介和使用说明
142 0
|
开发工具 C++ Windows
JRtplib开发笔记(三):JRtplib库编程使用说明
JRtplib开发笔记(三):JRtplib库编程使用说明
JRtplib开发笔记(三):JRtplib库编程使用说明