关于开源的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一定不一样,这也是主要的知识,用的时候要注意,多思考。

android rtp 开源,关于开源的RTP相关推荐

  1. 基于SIP和RTP协议的开源VOIP之QuteCom简单介绍

    **************************************************************************************************** ...

  2. 【Android RTMP】Android Studio 集成 x264 开源库 ( Ubuntu 交叉编译 | Android Studio 导入函数库 )

    文章目录 安卓直播推流专栏博客总结 一. x264 简介 二. x264 交叉编译 三. Android Studio 导入函数库 四. 交叉编译版本 五. GitHub 项目地址 安卓直播推流专栏博 ...

  3. android 开源_Android开源如何使其成为移动市场的领导者

    android 开源 大约10年前,当我买到第一部手机时,我对它的操作系统或处理器一无所知. 甚至它的屏幕大小都没有关系. 我很高兴拥有一部"手机"电话. 如今,手机范例已从功能手 ...

  4. android开源数据库,Android Hawk数据库 github开源项目

    Android Hawk数据库 github开源项目 Hawk 是一个很便捷的数据库  . 操作数据库仅仅需一行代码 , 能存不论什么数据类型 . github 地址: https://github. ...

  5. 针对Android平台播放器开源库NiceVieoPlayer倍速的开发

    Android平台的视频开源库可谓百花齐放,直接给出比较流行的几大框架github地址:https://github.com/search?l=Java&o=desc&q=ExoPla ...

  6. android app 的后台代码,包括后台的Android美食APP项目开源代码

    项目简介 小食光定位为一款集美食,社交,LBS服务于一体的美食推荐APP.为你发现周边美食的同时提供一个吃货分享的平台. APP截图 功能模块 美食推荐 :提供基础的美食信息查询: 商家推荐 : 基于 ...

  7. 各种Android UI开源框架 开源库

    各种Android UI开源框架 开源库 转 https://blog.csdn.net/zhangdi_gdk2016/article/details/84643668 自己总结的Android开源 ...

  8. 开发常用镜像资源替换为国内开源镜像(yum,compose,maven,docker,android sdk,npm,国内开源镜像汇总)...

    一.国内开源镜像站点汇总 阿里云开源镜像站 (http://mirrors.aliyun.com/) 网易开源镜像站 (http://mirrors.163.com/) 中国科学技术大学开源镜像站 ( ...

  9. 腾讯 android ui,腾讯开源的Android UI框架——QMUI Android

    各位同学,早上好,我是你们的老朋友D_clock爱吃葱花,前些天忙着发版本,最近也在看各种各样的新知识,有好多东西想写啊啊啊啊啊.嗯,先冷静捋一下,卖个关子.扯回正题,今天继续为大家推荐一个Githu ...

  10. 【健康生活,从BMI开始——Melendez的Android版本BMI计算器开源了】

    健康生活,从BMI开始--Melendez的Android版本BMI计算器开源了 健康生活,从BMI开始--Melendez的Android版本BMI计算器开源了 BMI是什么? 我的开源版本 感情各 ...

最新文章

  1. [转贴]现在在做一个WEB的站内消息系统,从工具栏位置弹出一徐徐上升的窗口...
  2. std:forward 完美转发
  3. TCP 三次握手 和 四次挥手
  4. 以下关于程序设计语言的叙述中,不正确的是()【最全!最详细解释!!】
  5. boolean类型默认值_「软帝学院」Java的基本数据类型
  6. JS数据结构与算法——选择排序(把小的数字依次往前放)
  7. java黄金分割点游戏_结对编程1——黄金点小游戏项目简介及需求分析
  8. 嵌入式中常见的存储器总结(二)SRAM VS DRAM
  9. html字幕字体大小,HTML字体集锦-
  10. 5道经典基础编程题让你入门C语言
  11. 【计算机网络自顶向下方法】(哈工大)学习笔记
  12. Java的图标和由来
  13. Intellij IDEA 插件下载慢或无法查询
  14. linux系统支持网银吗,我彻底方了!Linux下竟然也能使用网银?(图)
  15. HR:“最喜欢阿里出来的程序员了,技术又好又耐艹!” 我:???
  16. 【Python黑科技】孤独的程序员和AI机器人朋友聊天解闷(免费接口+保姆级图文+实现代码注释)
  17. macOS Monterey 12.1 (21C52) 虚拟机 IOS 镜像
  18. 浅谈public static void main(String[] args)
  19. Python基础(类与对象)
  20. ORACLE:分组函数

热门文章

  1. CHARIOT测量带宽、网速
  2. Python猴子摘桃
  3. Unity3D 虚拟现实开发(五)-UI篇
  4. RFID——充值消费系统
  5. [翻译] 在 Overleaf 上使用 xr 包来交叉引用
  6. python内核多线程库_python / numpy中的多线程blas
  7. DDK学习笔记(转)
  8. 【PHP代码审计】站帮主CMS漏洞挖掘
  9. redis漏洞利用总结
  10. 2020-0512-Game(博弈论/质因数)