关于开源的RTP——jrtplib的使用

关于开源的RTP——jrtplib的使用

关于jrtplib环境的建立,能够见我曾经写的总结,如今我主要来谈谈jrtplib3.71下的几个example的学习。 一、sample是一个简单的IPv4的列子,它实现了RTP在本机上的数据的传输。 1、初始化。我们知道RTP是一般是使用UDP协议来实现数据的传输,在windows环境下,当然要用到我们熟悉的套接字的使用,所以我们先要进行初始化,载入套接字库。

函数RTPGetErrorString(…)依据出错返回的一个负数来推断,利用jrtplib採用的统一出错机制返回的是一个C++中标准的字符串std::string,表示出错的信息,比喻我们指定的Portbase不是一个偶数。(为什么,以下要讲)
2、关于RTPSession对象设置
   因为要使用套接字,故我们在使用之前一定要为我们的监听socket指定一个监听端口,也就是这里的portbase的值。我们能够通过调用RTPSession的第二个參数RTPUDPv4TransmissionParams的成员函数来设定,
   transparams.SetPortbase(portbase);
 
   还有就是我们要通过RTPSession的第一个參数来设定以下一些值:
  
sessparams.SetOwnTimestampUnit(1.0/10.0);
//注意这个值我们一定要设置,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会话初始化过程所要进行的另外一项重要工
//作,他的单位是秒,如:当使用RTP会话传输8000Hz採样的音频数据时,因为时戳
//每秒钟将递增8000,所以时戳单元对应地应该被设置成1/8000:
sessparams.SetAcceptOwnPackets(true);
//通过这个函数我们能够设置是不是接收我们自己定义的数据包。
 
3、数据发送
   我想当我们要想建立连接的时候,我们就要让发送端知道要发送到的主机的IP地址,在jrtplib中我们能够通过RTPSession成员函数AddDestination()、DeleteDestination()和 ClearDestinations()来完毕。如以下是将数据发送给本机的6000号端口:
 
unsigned long addr = ntohl(inet_addr(“127.0.0.1”));
sess.AddDestination(addr, 6000);
 
当然我们还能够这样来完毕添�一个client,
 
RTPIPv4Address addr(destip,destport);//destip为clientIP地址,destport为client//端口号
status = sess.AddDestination(addr);
checkerror(status);  
  
   目标地址全部指定之后,接着就能够调用RTPSession类的SendPacket()方法,向全部的目标地址发送流媒体数据。SendPacket()是RTPSession类提供的一个重载函数,它具有下列多种形式:
int SendPacket(void *data,int len)
int SendPacket(void *data,int len,unsigned char pt,bool mark,
unsigned long timestampinc)
int SendPacket(void *data,int len,unsigned short hdrextID,void *hdrextdata,
int numhdrextwords)
int SendPacket(void *data,int len,unsigned char pt,bool mark,
unsigned long timestampinc,unsigned short hdrextID,
void *hdrextdata,int numhdrextwords)
SendPacket()最典型的使用方法是相似于以下的语句,当中第一个參数是要被发送的数据,而第二个參数则指明将要发送数据的长度,再往后依次是RTP负载类型、标识和时戳增量。例如以下所看到的:
status = sess.SendPacket((void *)”1234567890″,10,0,false,10);
checkerror(status);
对于同一个RTP会话来讲,负载类型、标识和时戳增量通常来讲都是同样的,JRTPLIB同意将它们设置为会话的默认參数,这是通过调用 RTPSession类的SetDefaultPayloadType()、SetDefaultMark()和 SetDefaultTimeStampIncrement()方法来完毕的。为RTP会话设置这些默认參数的优点是能够简化数据的发送,比如,假设为 RTP会话设置了默认參数:
session.SetDefaultPayloadType(96);//注意这个參数不能随便设置,參考RFC3551
session.SetDefaultMark(false);
session.SetDefaultTimestampIncrement(160);
在设置了以上的值后,我们能够这样来发送数据:
status = sess.SendPacket((void *)”1234567890″,10);
3、数据接收
对于流媒体数据的接收端,首先须要调用RTPSession类的PollData()方法来接收发送过来的RTP或者RTCP数据报。因为同一个 RTP会话中同意有多个參与者(源),你既能够通过调用RTPSession类的GotoFirstSource()和GotoNextSource() 方法来遍历全部的源,也能够通过调用RTPSession类的GotoFirstSourceWithData()和 GotoNextSourceWithData()方法来遍历那些携带有数据的源。在从RTP会话中检測出有效的数据源之后,接下去就能够调用 RTPSession类的GetNextPacket()方法从中抽取RTP数据报,当接收到的RTP数据报处理完之后,一定要记得及时释放。以下的代码示范了该怎样对接收到的RTP数据报进行处理:

 

 

 

JRTPLIB为RTP数据报定义了三种接收模式,当中每种接收模式都详细规定了哪些到达的RTP数据报将会被接受,而哪些到达的RTP数据报将会被拒绝。通过调用RTPSession类的SetReceiveMode()方法能够设置下列这些接收模式:
① RECEIVEMODE_ALL 缺省的接收模式,全部到达的RTP数据报都将被接受;
② RECEIVEMODE_IGNORESOME  除了某些特定的发送者之外,全部到达的RTP数据报都将被接受,而被拒绝的发送者列表能够通过调用AddToIgnoreList()、ClearIgnoreList()     和DeleteFromIgnoreList()方法来进行设置;
③ RECEIVEMODE_ACCEPTSOME  除了某些特定的发送者之外,全部到达的RTP数据报都将被拒绝,而被接受的发送者列表能够通过调用AddToAcceptList ()、ClearAcceptList ()和eleteFromAcceptList方法来进行设置。
4、执行程序
   在执行程序之前,我们要知道,这是基于UDP协议的数据报服务。我们的example1是在本机上实现的RTP传输,而且仅仅有一个RTPSession对象,所以我们的监听和接收的port是同一个,所以此时我们的portBase要和我们添�到RTPSession对象中的client的port一致,如上面我们能够都设置成6000.可是假设是在两个线程中,我们就要注意了,serverport和客户port一定不一样,这也是主要的知识,用的时候要注意,多思考。

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119067.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm入门教程(非常详细)_pipe使用教程

    pycharm入门教程(非常详细)_pipe使用教程1、汉化:把resources_zh.jar(自行下载)拷贝到PyCharm的安装目录下的lib目录,重启Pycharm即可。2、整体结构:3、常用功能介绍:(1)如何更换Python解释器:在文件->设置->项目:xxx下找到ProjectInterpreter。然后修改为你需要的Python解释器。注意这个地方一定要注意的是:在选择Python解释器的…

    2022年8月25日
    4
  • Java中的对象数组「建议收藏」

    Java中的对象数组「建议收藏」Java对象数组在创建后,基本数据类型数组可以直接对数组元素赋值、引用等操作;而自定义对象数组,需要对数组中的每个对象元素独立进行创建,然后才可以对其赋值、引用等操作,如果没有单独对每个对象元素创建,会导致空指针异常1.基本数据类型数组数组都要先声明、再创建后使用。基本数据类型数组的声明有以下几种格式(以int类型为例):①int[]array;②int[]array=newint;③in…

    2022年7月16日
    13
  • centos 日志审计_CentOS7 – 审计日志[通俗易懂]

    centos 日志审计_CentOS7 – 审计日志[通俗易懂]1、auditctl:即时控制审计守护进程的行为的工具,比如如添加规则等等。audtitctl-l#查看规则auditctl-D#清空规则2、aureport:查看和生成审计报告的工具。aureport-l#生成登录审计报告3、ausearch:查找审计事件的工具ausearch-i-p40964、autrace:一个用于跟踪进程的命令。autrace-r/u…

    2022年5月23日
    379
  • 如何编写优秀的单元测试用例「建议收藏」

    如何编写优秀的单元测试用例「建议收藏」优秀单元测试的定义​单元测试:一段自动化的代码,这段代码调用被测试的工作单元,之后对这个工作单元的单个最终结果的某些假设进行检验。单元测试几乎都是用单元测试框架进行编写。单元测试容易编写,快速运行,可自动化,可靠,可读,可维护,结果稳定。  集成测试:对一个工作单元进行的测试,这个测试对被测试的工作单元没有完全的控制,并使用该单元的一个或多个真实依赖物,例如数据库、系统时间、系统文件等  工作单元:从调用系统一个公共方法到产生一个测试可见的最终结果,其间这个系统发生的行为。一个

    2022年6月15日
    37
  • 把list转为JSON字符串

    把list转为JSON字符串把list转为字符串,把对象转为字符串,toJSONString(),json的jar包

    2022年10月17日
    0
  • 什么是JavaBean?它的作用是什么?

    什么是JavaBean?它的作用是什么?定义:JavaBean是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取。众所周知,属性名称符合这种模式,其他Java类可以通过自省机制(反射机制)发现和操作这些JavaBean的属性。JavaBean可分为两种:一种是有…

    2022年7月7日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号