jrtplib库的使用 收藏
一、sample是一个简单的IPv4的列子,它实现了RTP在本机上的数据的传输。
 
1、初始化。
我们知道RTP是通常是使用UDP协议来实现数据的传输,在windows环境下,当然要用到我们熟悉的套接字的使用,所以我们先要进行初始化,加载套接字库。
view plaincopy to clipboardprint?
#ifdef WIN32  
WSADATA dat;  
WSAStartup(MAKEWORD(2,2),&dat);  
#endif // WIN32  
RTPSession sess;  
   
//当然在我们程序结束的时候,我们要清理套接字库。  
#ifdef WIN32  
               WSACleanup();  
#endif // WIN32  
   
//还有关于头文件,我们需要用到以下一些:  
#include "rtpsession.h"          //定义了RTPSession  
#include "rtppacket.h"           //定义了RTPPacket数据包  
#include "rtpudpv4transmitter.h" //定义了RTPSession的第二个参数  
 //RTPUDPv4TransmissionParams  
#include "rtpipv4address.h"      //定义了rtpipv4address  
#include "rtpsessionparams.h"    //定义了RTPSession的第一个参数  
                                 // RTPSessionParams  
#include "rtperrors.h"           //定义了RTP中的错误信息  
   
//获得出错信息,我们在使用时不可避免地要出错,故我们可以通过//jrtplib的函数来获得我们出错的信息,方法如下:  
void checkerror(int rtperr)  
{  
if (rtperr < 0)  
{  
std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;  
exit(-1);  
}  

#ifdef WIN32
WSADATA dat;
WSAStartup(MAKEWORD(2,2),&dat);
#endif // WIN32
RTPSession sess;
 
//当然在我们程序结束的时候,我们要清理套接字库。
#ifdef WIN32
               WSACleanup();
#endif // WIN32
 
//还有关于头文件,我们需要用到以下一些:
#include "rtpsession.h"          //定义了RTPSession
#include "rtppacket.h"           //定义了RTPPacket数据包
#include "rtpudpv4transmitter.h" //定义了RTPSession的第二个参数
 //RTPUDPv4TransmissionParams
#include "rtpipv4address.h"      //定义了rtpipv4address
#include "rtpsessionparams.h"    //定义了RTPSession的第一个参数
                                 // RTPSessionParams
#include "rtperrors.h"           //定义了RTP中的错误信息
 
//获得出错信息,我们在使用时不可避免地要出错,故我们可以通过//jrtplib的函数来获得我们出错的信息,方法如下:
void checkerror(int rtperr)
{
if (rtperr < 0)
{
std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
exit(-1);
}
}
函数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);
 
当然我们还可以这样来完成加入一个客户端,
 
RTPIPv4Address addr(destip,destport);//destip为客户端IP地址,destport为客户端//端口号
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数据报进行处理:
view plaincopy to clipboardprint?
session.BeginDataAccess();  
if (session.GotoFirstSource()){  
do{  
      RTPPacket *packet;  
while ((packet = session.GetNextPacket()) != 0){  
            cout << "Got packet with extended sequence number " 
                  << packet->GetExtendedSequenceNumber()  
                 << " from SSRC " << packet->GetSSRC() <<endl;  
              session.DeletePacket(packet);  
}  
     } while (session.GotoNextSource());  
   }  
   session.EndDataAccess(); 
session.BeginDataAccess();
if (session.GotoFirstSource()){
do{
      RTPPacket *packet;
while ((packet = session.GetNextPacket()) != 0){
            cout << "Got packet with extended sequence number "
                  << packet->GetExtendedSequenceNumber()
                 << " from SSRC " << packet->GetSSRC() <<endl;
              session.DeletePacket(packet);
}
     } while (session.GotoNextSource());
   }
   session.EndDataAccess();
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对象,所以我们的监听和接收的端口是同一个,所以此时我们的portBase要和我们加入到RTPSession对象中的客户端的端口一致,如上面我们可以都设置成6000.但是如果是在两个线程中,我们就要注意了,服务器端口和客户端口一定不一样,这也是基本的知识,用的时候要注意,多思考。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/li_007/archive/2007/07/13/1689005.aspx

发表于 @ 2009年09月08日 14:09:00 | 评论( 0 ) | 编辑| 举报| 收藏

旧一篇:jrtplib介绍 | 新一篇:修炼开始!
-
查看最新精华文章 请访问博客首页相关文章
关于开源的jrtplib的编译和应用程序的配置关于开源的RTP——jrtplib的使用(2)VC6.0中如何让new操作失败后抛出异常?(转载)开源RTP库JRTPLIB 初学VC 6 RTP流媒体传输协议编程实例jrtplib 使用JRTP下的两个示例程序jrtplib传输:请问各位高手,我想将下面的程序改成在vc下能运行的,需要怎么修改,不胜感激!!望有成功者留一个联系方式给我,我做毕设,想请教一下!不胜感激!发表评论表 情:          评论内容: 用 户 名:登录 注册 匿名评论 lintianbao验 证 码:  重新获得验证码
  热门招聘职位【中国知网】高薪诚聘精英技术人才【广东美成达】移民公司诚聘ASP.net程序员【热聘】搜狐畅游全国热招开发工程师【《七雄争霸》研发商:北京游戏谷】诚聘JAVA、C++技术专家及各类游戏精英【华北计算技术研究所】急聘Java开发、系统架构、需求分析【【江苏金百临投资咨询有限公司】】诚聘!程序员ASP.NET+软件开发工程师C++【西安瑞祺科技】诚聘JAVA软件工程师【雅邦网络】诚聘网站项目经理、JAVA技术总监、JAVA开发、网站测试工程师【科锐】诚招IT中高级人才,抢工作机会,赢IPAD啦!【imo】-国际风投+福利租房+奖金+期权+不加班+调休,邀你共创互联网的奇迹【YOHO!新力传媒】高薪诚聘各类网站人才 北京+南京【方正国际】诚招软件精英 北京+苏州+武汉【中国知网】高薪诚聘精英技术人才【广东美成达】移民公司诚聘ASP.net程序员【热聘】搜狐畅游全国热招开发工程师【《七雄争霸》研发商:北京游戏谷】诚聘JAVA、C++技术专家及各类游戏精英【华北计算技术研究所】急聘Java开发、系统架构、需求分析【【江苏金百临投资咨询有限公司】】诚聘!程序员ASP.NET+软件开发工程师C++【西安瑞祺科技】诚聘JAVA软件工程师【雅邦网络】诚聘网站项目经理、JAVA技术总监、JAVA开发、网站测试工程师【科锐】诚招IT中高级人才,抢工作机会,赢IPAD啦!【imo】-国际风投+福利租房+奖金+期权+不加班+调休,邀你共创互联网的奇迹【YOHO!新力传媒】高薪诚聘各类网站人才 北京+南京【方正国际】诚招软件精英 北京+苏州+武汉 公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告
北京创新乐知信息技术有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
江苏乐知网络技术有限公司 提供商务支持
 Email:webmaster@csdn.net
Copyright © 1999-2010, CSDN.NET, All Rights Reserved

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ipromiseu/archive/2009/09/08/4531656.aspx

jrtplib库的使用相关推荐

  1. linux 下基于jrtplib库的实时传送实现

    linux 下基于jrtplib库的实时传送实现 一.RTP 是进行实时流媒体传输的标准协议和关键技术 实时传输协议(Real-time Transport Protocol,PRT)是在 Inter ...

  2. linux下基于jrtplib库的实时传送实现

    linux 下基于jrtplib库的实时传送实现 一.RTP 是进行实时流媒体传输的标准协议和关键技术  实时传输协议(Real-time Transport Protocol,PRT)是在 Inte ...

  3. 基于JRTPLIB库的RTP数据传输设计文档(1)

    关键词:JRTPLIB  RTP  ARM  交叉编译 BCNG  项 目 组 技 术 文 档                            基于JRTPLIB库的RTP数据传输设计文档   ...

  4. JRtplib开发笔记(二):JRtplib库编译、示例演示

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

  5. 基于JRTPLIB库的RTP数据传输设计文档

    http://xiyong8260.blog.163.com/blog/static/665146212008824112748499/  版权所有,若转载,请注明出处,谢谢合作.  关键词:JRTP ...

  6. jrtplib库使用简解

    RTP有效载荷类型即时间截解释 =============================== https://www.cnblogs.com/wyqfighting/archive/2013/03/ ...

  7. 【流媒體】jrtplib—VS2010下RTP开源协议库JRTPLIB3.9.1编译

    一.JRTPLIB简介 老外用C++编写的开源RTP协议库,用来进行实时数据传输,可以运行在 Windows.Linux. FreeBSD.Solaris.Unix和VxWorks 等多种操作系统上, ...

  8. 【流媒體】jrtplib—VS2010 下RTP开源协议库JRTPLIB3.9.1编译

    [流媒體]jrtplib-VS2010下RTP开源协议库JRTPLIB3.9.1编译 SkySeraph Apr 7th 2012 Email:skyseraph00@163.com 一.JRTPLI ...

  9. jrtplib开源库系列之三:jrtplib发送接收数据流程

    说明 前面2篇文章主要说明了如何安装jrtplib库,以及对example1进行了说明,这篇文章主要说下jrtplib库数据的收发流程. 数据收发流程 从例子1就可以很好的说明jrtplib的使用是非 ...

最新文章

  1. android media player setlooping,Android Mediaplayer-一次播放铃声
  2. Xilinx Select IO的介绍
  3. Java 中一个中文所占字节
  4. Cuckoo Hashing的应用及性能优化
  5. ICLR 2020 | 可提速3000倍的全新信息匹配架构(附代码复现)
  6. Spring MVC Boot Cloud 技术教程汇总
  7. java 等分切割图片_java 将list按指定大小等分,最后多余的单独一份
  8. Java 并发编程之线程池 ExecutorService 接口
  9. mysql索引 order by_MySQL 通过索引优化含ORDER BY的语句
  10. linux之debian自动登录
  11. DDA数值微分法详解
  12. CAD填充块Hatch的深度解析
  13. Redis 安装说明
  14. 用EasySysprep封装Win7系统
  15. 《怦然心动》(Flipped) 观后感
  16. 在星巴克聊聊“一找小七”
  17. 【其实是空空荡荡的牵挂,没有结局的怀念】
  18. 信息学奥赛一本通1005:地球人口承载力估计
  19. 树莓派学习记录1-树莓派系统烧录与无屏幕网线连接开机
  20. MQTT之十一 阿里云物联网平台网址

热门文章

  1. 关于MySQL联合索引和优化军规
  2. (五)Tomcat源码阅读:Connector组件分析
  3. 验证码生成原理即Python代码实现
  4. 蒲公英——APP内测分发平台
  5. 2、controller介绍
  6. 我就是那个错过了乔布斯的变态老码农
  7. 大前端开发 前端如何开发 APP
  8. bitset和bitget
  9. vue设置scrollTop不起作用
  10. linux vi 报错 E37: No write since last change (add to override)