JRtplib开发笔记(三):JRtplib库编程使用说明

简介: JRtplib开发笔记(三):JRtplib库编程使用说明

原博主博客地址:https://blog.csdn.net/qq21497936

本文章博客地址:https://blog.csdn.net/qq21497936/article/details/84957120

JRtplib开发笔记(一):JRtplib简介、JThread库编译》: https://blog.csdn.net/qq21497936/article/details/84785284

JRtplib开发笔记(二):JRtplib库编译、示例演示》: https://blog.csdn.net/qq21497936/article/details/84785593

JRtplib开发笔记(三):JRtplib库编程使用说明》: https://blog.csdn.net/qq21497936/article/details/84957120

JRtplib开发笔记(四):JRtplib的VS开发环境搭建以及Demo》: https://blog.csdn.net/qq21497936/article/details/84957708

 

         JRtplib开发笔记(三):JRtplib的使用说明

 

前话

       前面编译了jthread,jrtplib以及解析了源码自带示例,接下来介绍jrtplib的使用。

 

JRtplib使用说明

步骤一:使用JRtplib类需要先引入命令空间,如下:

using namespcace jrtplib;

步骤二:使用JRtplib需要创建一个RTPSession对象,类似于全局上下文句柄

RTPSession rtpSession;

步骤三:创建会话,您必须调用Create成员函数,该函数有两个参数:

  • 第一个参数是RTPSessionParams类型,并指定会话的常规选项。必须显式设置此类的一个参数,否则将无法成功创建会话,此参数是要发送的数据的时间戳单位,可以通过将某个时间间隔(以秒为单位)除以该时间间隔内的样本数来计算,还可以设置是否接收数据包;
RTPSessionParams sessionparams;
// 时间戳:1秒钟8000个样本
sessionParams.SetOwnTimestampUnit(1.0/8000.0)
// 设置是否接收属于本身的数据,true-接收,false-不接收
sessionParams.SetAcceptOwnPackets(true)
  • 第二个参数是指向RTPTransimissionParams实例的指针,并描述传输组件的参数,默认情况下,使用UDP over IPv4发送器,对于此特定发送其,传输参数应为RTPUDPv4RransmissionParams类型。
RTPUDPv4TransmissionParams transparams;
// 设置本地接收的端口号
transparams.SetPortbase(8000)

     如果库是使用JThread支持编译的,则传入的数据将在后台处理。如果在编译时未启用JThread支持,或者如果您在会话参数中指定不应使用轮询线程,则必须定期调用RTPSession成员函数Poll来处理传入数据并在必要时发送RTCP数据。

 

步骤四:加入监听地址列表

加入地址(包括ip地址和端口号),

  • 发送端

若是发送端则是发送的目标地址,点对点发送与多播(组播)发送操作代码不区分:

char destIp [16] = “224.0.0.1”;
int destPort = 10000;
RTPIPv4Address addr(ntohl(inet_addr(destIp)), destPort);
status = sess.AddDestination(addr);
if (status < 0)
{
  std::cerr << RTPGetErrorString(status) << std::endl;
  exit(-1);
}
  • 接收端

若是接收端则是设置本地监听目标地址,一般是“127.0.0.1”和端口号:

char destIp [16] = “127.0.0.1”;
int destPort = 10000;
RTPIPv4Address addr(ntohl(inet_addr(destIp)), destPort);
status = session.AddDestination(addr);
if (status < 0)
{
  std::cerr << RTPGetErrorString(status) << std::endl;
  exit(-1);
}

组播则是组播地址+端口号,并且加入组播地址

char groupIp[16] = “224.0.0.1”;
int port = 10000;
RTPIPv4Address addr(ntohl(inet_addr(groupIp)), port);
_rtpSession.JoinMulticastGroup(addr);

步骤五:开始接收/发送

       先使用GotoFirstSourceWidthData获取收到的数据源,然后开始循环接收,定义数据包的指针RTPpacket,然后进入循环接收是否有数据包GetNextPacket有的画返回非NULL,获取数据长度和收到的数据,可对数据进行处理,这里特别注意每次接收完成后需要调用DeletePacket对数据包进行删除,结合了发送和接收的代码如下:

// 开始接收数据
_rtpSession.BeginDataAccess();
if (_rtpSession.GotoFirstSourceWithData())
{
  do {
     // 数据包指针
     RTPPacket *packet;
     while ((packet = _rtpSession.GetNextPacket()) != NULL)
     {
       // 获取接收数据长度
       unsigned int recvSize = packet->GetPayloadLength();
       // 获取接收数据
       unsigned char * recvData = (unsigned char *)packet->GetPayloadData();
       // 删除数据包
       _rtpSession.DeletePacket(packet);
       // 获取下一个有数据的数据源(rtp加入监听地址的源)
     } while (_rtpSession.GotoNextSourceWithData());
  }
  // 关闭接收数据
  _rtpSession.EndDataAccess();
  // 睡眠100ms
  RTPTime::Wait(RTPTime(0, 100));
}

步骤六:退出发送或者接收

       发送退出记得释放内存即可,但是接收退出有两点要注意:

      第一点是若是开始接收数据BeginDataAccess一定要调用EndDataAccess否则不会关掉jthread线程,不会马上退出,退出不了也就无法重新Create

       第二点是接收了数据包则一定要调用DeletePacket数据包,然后调用销毁和等待退出,只要调用了EndDataAccessAboutWait基本上是立即返回的,秒开秒关。

_rtpSession.Destroy();
_rtpSession.AbortWait();

JRtplib模块化

     

      编译的静态库,不然在调用该库运行的时候根据windows sdk版本问题,导致直接运行无反应,避免这些坑直接使用静态库,带”_d”的是debug版本的库。

 

JRtplib开发笔记(一):JRtplib简介、JThread库编译》: https://blog.csdn.net/qq21497936/article/details/84785284

JRtplib开发笔记(二):JRtplib库编译、示例演示》: https://blog.csdn.net/qq21497936/article/details/84785593

JRtplib开发笔记(三):JRtplib库编程使用说明》: https://blog.csdn.net/qq21497936/article/details/84957120

JRtplib开发笔记(四):JRtplib的VS开发环境搭建以及Demo》: https://blog.csdn.net/qq21497936/article/details/84957708

 

原博主博客地址:https://blog.csdn.net/qq21497936

本文章博客地址:https://blog.csdn.net/qq21497936/article/details/84957120

 


相关文章
|
5月前
|
C++
jrtplib开源库系列之一:jrtplib介绍、安装和测试(window 10环境介绍)
关于jrtplib库网上已经有很多介绍,而且目前jrtplib作者已经停止更新(Apr 18, 2020),最新版本为v3.11.2。本系列内容也以该版本进行介绍。 相信你已经对RTP/RTCP协议有一定的了解,并想更深入的了解RTP协议的具体实现,jrtplib就是使用使用C++实现的RTP/RTCP协议。具体标准为RFC3550,如果想仔细阅读原文,但是对英文又有点吃力,可以参考我的博客RTP/RTCP中英文对照,在博客的后面有百度链接,是对RFC3550的中文翻译,可能很多地方不太准确,有些内容是自己添加进去的,希望不会影响你的阅读。
98 0
|
12月前
|
网络协议 Linux iOS开发
【100天精通python】Day40:GUI界面编程_PyQt 从入门到实战(完)_网络编程与打包发布
【100天精通python】Day40:GUI界面编程_PyQt 从入门到实战(完)_网络编程与打包发布
139 0
|
3月前
|
Linux
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist
《FFmpeg开发实战》书中介绍了直播的RTSP和RTMP协议,以及新协议SRT和RIST。SRT是安全可靠传输协议,RIST是可靠的互联网流传输协议,两者于2017年发布。腾讯视频云采用SRT改善推流卡顿。以下是Linux环境下为FFmpeg集成libsrt和librist的步骤:下载安装源码,配置、编译和安装。要启用这些库,需重新配置FFmpeg,添加相关选项,然后编译和安装。成功后,通过`ffmpeg -version`检查版本信息以确认启用SRT和RIST支持。详细过程可参考书中相应章节。
62 1
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist
|
4月前
|
编解码 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配置并安装。
64 2
FFmpeg开发笔记(二十八)Linux环境给FFmpeg集成libxvid
|
5月前
jrtplib开源库系列之二:jrtplib库example1分析说明
这个官方example还是比较简单的,主要是测试发一个数据包,然后自己接收发出的包,注意,这里需要注意将目的地址的端口和基端口(portbase)设置为相同,同时需要将这个参数设置为真sessparams.SetAcceptOwnPackets(true);
91 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
556 0
|
IDE Linux 调度
JRtplib开发笔记(一):JRtplib简介、JThread库编译
JRtplib开发笔记(一):JRtplib简介、JThread库编译
JRtplib开发笔记(一):JRtplib简介、JThread库编译
|
编译器 C++
JRtplib开发笔记(二):JRtplib库编译、示例演示
JRtplib开发笔记(二):JRtplib库编译、示例演示
JRtplib开发笔记(二):JRtplib库编译、示例演示
|
网络协议 Linux Windows
LibModbus库开发笔记(一):libmodbus库介绍、编译和基础工程模板
LibModbus库开发笔记(一):libmodbus库介绍、编译和基础工程模板
LibModbus库开发笔记(一):libmodbus库介绍、编译和基础工程模板
|
IDE 开发工具 C语言
JRtplib开发笔记(四):JRtplib的VS开发环境搭建以及Demo
JRtplib开发笔记(四):JRtplib的VS开发环境搭建以及Demo
JRtplib开发笔记(四):JRtplib的VS开发环境搭建以及Demo
下一篇
无影云桌面