转自:https://www.cnblogs.com/elisha-blogs/p/3963126.html
ORTP库API使用入门

一、简介

ORTP是一个支持RTP以及RFC3550协议的库,有如下的特性: 
(1)使用C语言编写,可以工作于windows, Linux, 以及 Unix平台 
(2)实现了RFC3550协议,提供简单易用的API。支持多种配置,RFC3551为默认的配置。 
(3)支持单线程下的多个RTP会话,支持自适应抖动处理。 
(4)基于GPL版权声明。

ORTP可以在其官方网站上(http://www.linphone.org/index.php/eng/code_review/ortp)下载,下载解压后得到ORTP的源码包和示例程序(tests)。其帮助文档在docs目录下,也可以在 http://mirror.veriportal.com/savannah/linphone/ortp/docs/在线查看。

关于ORTP的资料并不多,主要是其源码、帮助文档以及示例程序,关于示例程序说明如下: 
rtprecv.c 和rtpsend.c 展示了如何接收和发送单RTP数据流。 
mrtprecv.c mrtpsend.c 展示了如何同时接收和发送多个RTP

二、主要函数介绍

rtp_session_init

函数原型:void rtp_session_init (RtpSession * session, int mode)

函数功能:执行rtp会话的一些必要的初始化工作

参数含义:

session: rtp会话结构体,含有一些rtp会话的基本信息

mode:   传输模式,有以下几种,决定本会话的一些特性。

RTP_SESSION_RECVONLY:只进行rtp数据的接收

RTP_SESSION_SENDONLY:只进行rtp数据的发送

RTP_SESSION_SENDRECV:可以进行rtp数据的接收和发送

执行的操作:

1.       设置rtp包缓冲队列的最大长度

2.       根据传输模式设置标志变量的值

3.       随机产生SSRC和同步源描述信息

4.       传入全局的av_profile,即使用默认的profile配置

5.       初始化rtp包缓冲区队列

6.       发送负载类型默认设置为0(pcmu音频),接收负载类型默认设置为-1(未定义)

7.       将session的其他成员的值均设置一个默认值。

rtp_session_set_scheduling_mode

函数原型:void rtp_session_set_scheduling_mode (RtpSession * session, int yesno)

函数功能: RtpScheduler管理多个session的调度和收发的控制,本函数设置是否使用该session调度管理功能。

参数含义:

session: rtp会话结构体

yesno:   是否使用rtp session的系统调度功能

说明:

如果yesno为1,则表明使用系统的session调度管理功能,意味着可以使用以下功能:

1. 可以使用session_set_select在多个rtp会话之间进行选择,根据时间戳判定某个会话是否到达了收发的时间。

2. 可以使用rtp_session_set_blocking_mode()设置是否使用阻塞模式来进行rtp包的发送和接收。

如果yesno为0,则表明该会话不受系统管理和调度。

关于rtp session的管理和调度,由全局的变量RtpScheduler *__ortp_scheduler来负责,该变量必须通过ortp_scheduler_init() 来进行初始化操作。

rtp_session_set_blocking_mode

函数原型:void rtp_session_set_blocking_mode (RtpSession * session, int yesno)

函数功能:设置是否使用阻塞模式,

参数含义:

session: rtp会话结构体

yesno:  是否使用阻塞模式

说明:

阻塞模式只有在scheduling mode被开启的情况下才能使用,本函数决定了rtp_session_recv_with_ts() 和 rtp_session_send_with_ts()两个函数的行为,如果启用了阻塞模式,则rtp_session_recv_with_ts()会 一直阻塞直到接收RTP包的时间点到达(这个时间点由该函数参数中所定义的时间戳来决定),当接收完RTP数据包后,该函数才会返回。同 样,rtp_session_send_with_ts()也会一直阻塞直到需要被发送的RTP包的时间点到达,发送结束后,函数才返回。

rtp_session_signal_connect

函数原型:int rtp_session_signal_connect (RtpSession * session, const char *signal,   RtpCallback cb, unsigned long user_data)

函数功能:本函数提供一种方式,用于通知应用程序各种可能发生的RTP事件(信号)。可能通过注册回调函数的形式来实现本功能。

参数含义:

session: rtp会话结构体

signal: 信号的名称

cb:     回调函数

user_data:传递给回调函数的数据

返回值:0表示成功,-EOPNOTSUPP表示信号名称不存在,-1表示回调函数绑定错误

说明:

信号的名称必须是以下字符串中的一种:

"ssrc_changed" : 数据流的同步源标识改变

"payload_type_changed" : 数据流的负载类型改变

"telephone-event_packet" : telephone-event RTP包(RFC2833)被接收

"telephone-event" : telephone event 发生

"network_error" : 网络错误产生,传递给回调函数的是描述错误的字符串(const char *型)或者错误码(int型)

"timestamp_jump" : 接收到的数据包发生了时间戳的跳跃。

要取消事件(信号)的监听,可以使用下面这个函数

int rtp_session_signal_disconnect_by_callback ( RtpSession * session, const char * signal_name, RtpCallback cb )

rtp_session_set_local_addr

函数原型:int rtp_session_set_local_addr( RtpSession * session, const char * addr,int port)

函数功能:设置本地rtp数据监听地址

参数含义:

session: rtp会话结构体

addr: 本地IP地址,例如127.0.0.1,如果为NULL,则系统分配0.0.0.0

port:   监听端口,如果设置为-1,则系统为其自动分配端口

返回值: 0表示成功

说明:

如果是RTP_SESSION_SENDONLY(只发送)型会话,则不需要进行本设置,而必须设置rtp_session_set_remote_addr() 来设置远程目的地址。

如果采用了系统自动分配监听端口,则可以通过int rtp_session_get_local_port(const RtpSession *session) 来获取系统分配的监听端口号。

rtp_session_set_remote_addr

函数原型:int rtp_session_set_remote_addr (RtpSession * session, const char * addr, int port)

函数功能:设置RTP发送的目的地址

参数含义:

session: rtp会话结构体

addr: 目的IP地址

port:   目的地址的监听端口号

返回值: 0表示成功

rtp_session_set_send_payload_type

函数原型:int rtp_session_set_send_payload_type (RtpSession * session, int paytype)

函数功能:设置RTP发送数据的负载类型

参数含义:

session: rtp会话结构体

paytype:负载类型

返回值: 0表示成功,-1表示负载未定义

说明:

负载类型在payloadtype.h文件中有详细的定义,RTP接收端有着类似的负载类型设置函数,int rtp_session_set_recv_payload_type ( RtpSession * session, int paytype ) ,注意,发送的负载类型必须与接收的负载类型一致才能正常完成收发。

rtp_session_send_with_ts

函数原型:int rtp_session_send_with_ts (RtpSession * session, const char * buffer, int len,uint32_t userts)

函数功能:发送RTP数据包

参数含义:

session: rtp会话结构体

buffer: 需要发送的RTP数据的缓冲区

len:    需要发送的RTP数据的长度

userts: 本RTP数据包的时间戳

返回值: 成功发送到网络中的字节数

说明:

发送RTP数据需要自己管理时间戳的递增,每调用一次本函数,请根据实际情况对userts进行递增,具体递增的规则见RTP协议中的说明。

例如:如果发送的是采样率为90000Hz的视频数据包,每秒25帧,则时间戳的增量为:90000/25 = 3600

时间戳的起始值为随机值,建议设置为0 。

rtp_session_recv_with_ts

函数原型:int rtp_session_recv_with_ts (RtpSession * session, char * buffer,int len, uint32_t time, int * have_more)

函数功能:接收RTP数据包

参数含义:

session: rtp会话结构体

buffer: 存放接收的RTP数据的缓冲区

len:    期望接收的RTP数据的长度

time:   期望接收的RTP数据的时间戳

have_more:标识接收缓冲区是否还有数据没有传递完。当用户给出的缓冲区不够大时,为了标识缓冲区数据未取完,则have_more指向的数据为1,期望用户以同样的时间戳再次调用本函数;否则为0,标识取完。

rtp_session_destroy
【原型】: void rtp_session_destroy(RtpSession *session)
【功能】:摧毁rtp会话对象,释放资源
【参数】:session已经创建的RTP会话对象

转载于:https://www.cnblogs.com/kiss-passion/p/10362200.html

ORTP库API使用入门相关推荐

  1. 第三季2:ORTP库的源码分析、RTP发送实验的源码分析

    以下内容源于朱有鹏课程,如有侵权,请告知删除. 一.ORTP库源码分析 1.ORTP库概览 (1)库提供一堆功能函数(本身没有main),都在src目录下 (2)库的使用给了案例(有main),在sr ...

  2. 【STM32H7教程】第91章 STM32H7的FDCAN总线基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第91章       STM32H7的FDCAN总线基础知识和 ...

  3. 报表引擎API开发入门— EJB程序数据源

    2019独角兽企业重金招聘Python工程师标准>>> 我们前面讲了几个数据源,今天我们来讲一下EJB数据源,这篇讲完我们数据源这部分就讲完了.数据连接不需要直接访问数据库,而是使用 ...

  4. 开源纯C日志函数库iLOG3快速入门(八、如果你喜欢简单日志函数甚于日志函数库)...

    2019独角兽企业重金招聘Python工程师标准>>> 开源纯C日志函数库iLOG3快速入门(八.如果你喜欢简单日志函数甚于日志函数库) 很多网友来信坚持表达了在项目中应使用简单日志 ...

  5. Keras functional API快速入门

    2019独角兽企业重金招聘Python工程师标准>>> Keras functional API快速入门 The Keras functional API is the way to ...

  6. 【Python基础】科学计算库Scipy简易入门

    0.导语 Scipy是一个用于数学.科学.工程领域的常用软件包,可以处理插值.积分.优化.图像处理.常微分方程数值解的求解.信号处理等问题.它用于有效计算Numpy矩阵,使Numpy和Scipy协同工 ...

  7. python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解

    使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...

  8. 第三季1:ORTP库的移植与局域网视频传输

    以下内容源于朱有鹏课程,如有侵权,请告知删除. 本季课程重点在于使用ORTP库来实现局域网视频实时传输. 一.ORTP的介绍 1.视频网络传输的两种方式 (1)基于下载 比如http(Hyper Te ...

  9. php yii2 api框架,Yii2框架制作RESTful风格的API快速入门教程

    先给大家说下什么是REST restful REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Ro ...

最新文章

  1. 这些知名制药跨国企业都实施了SAP系统
  2. Elasticsearch设置最大返回条数
  3. Problems encountered while deleting resources. Could not delete 'E:\MyEclipse file\check\WebRoot\i
  4. log4j添加日志一定记住在工程的web.xml文件下加一些内容
  5. 数据库-优化-SQL及索引优化
  6. Servelt中的ServletContext对象
  7. 如何建立MSSQL数据库
  8. java sha1hash 算法_javaweb使用sha1算法登录加密的整个过程
  9. paip.图片文件上传功能总结
  10. 基于Vue的车辆租赁管理系统设计与实现
  11. 重置SMC与重置NVRAM(PRAM)
  12. Google Earth Engine APP(GEE)——用一个选择器选择不同城市的应用
  13. 用antd实现番茄钟
  14. ChatOps 如何帮助你更好地开发 DevOps
  15. power pviot
  16. 华为智慧屏v98摄像头像素是多少
  17. 总体规划,循序渐进,分步实施
  18. 汽车散热器不同造型的注塑件管口密封方案
  19. fatal error C1083: Cannot open include file: 'uxtheme.h'的解决
  20. MATLAB学习笔记3:MATLAB编程基础(前半)

热门文章

  1. 如和用Python获取今日头条上面三千美女图,且看教程
  2. 韩国巨型机器人曝光,走一步地动山摇
  3. 【shell基础】10、函数
  4. 火狐浏览器快捷键大全
  5. [erlang]erlang程序运行的几种方式
  6. mybatis 添加语句返回对象_Mybatis底层源码分析
  7. Java继承_30道最常问的Java基础面试题
  8. 火了 2 年的服务网格究竟给微服务带来了什么?(转载)
  9. Zookeeper(三)——选举机制
  10. hdp对应hadoop的版本_好程序员大数据学习路线分享hadoop的知识总结