没有合适的资源?快使用搜索试试~ 我知道了~
首页Linphone学习文档
Linphone学习文档
5星 · 超过95%的资源 需积分: 10 228 下载量 65 浏览量
更新于2023-03-03
评论 6
收藏 821KB PDF 举报
最近学习Linphone的代码,分享一篇文档,文档里列出了Linphone里的主线、代码分析、函数调用过程
资源详情
资源评论
资源推荐
Linphone 分析
一 linphone 架构及组成模块 ..............................................................................................................................2
二 linphone 系统框图...........................................................................................................................................3
三 linphone 中各个模块说明 ..............................................................................................................................3
四 linphone 中数据结构说明 ..............................................................................................................................7
五 linphone 的初始化过程...................................................................................................................................7
六 linphone 建立通话过程说明........................................................................................................................10
1 拨号 call 过程 ...........................................................................................................................................10
2 等待响应 ...................................................................................................................................................16
3 Answer 过程分析.......................................................................................................................................21
4 关于 RTP 及音视频流的网络传输........................................................................................................22
5 总结............................................................................................................................................................23
七 linphone 会话执行过程 log 分析.................................................................................................................24
八 linphone 使用参考.........................................................................................................................................40
岳维功
基于 linphone-3.3.2 版本,新版本 linphone-3.4.3 支持同时有多路 call,所以,相比之前版本会有不少
变化。
一 linphone 架构及组成模块
Linphone 是一款跨平台的可视电话客户端软件,同时支持视频通话功能。Linphone 可以在 Linux,
windows 等主流操作系统平台上运行。
Linphone 基于开源软件构建,本身也是开源软件。Linphone 架构中 sip 协议的处理基于 osip 以及
exosip 两个开源库实现,媒体数据的选择整合处理使用 mediastream2 完成,该软件使用 ffmepg、speedx
等多款开源软件完成音视频的编解码,并通过 ortp 完成基于 rtp 协议的音视频数据传输。ortp 是一款
处理 RTP 会话的开源软件。
1 整体架构图如下:
整个软件分为两层,上层为用户接口前端(user interface frontends),下层为 linphone 核心引擎
(linphone core engine)。
2 功能模块说明:
Liblinphone 核心引擎实现了 linphone 所有的功能函数,而且能够方便的添加音频和视频的呼叫
功能。Liblinphone 也提供高层的 API,用来初始化,接收或者终止呼叫。Liblinphone 依赖于下面三
个组件:
1 Mediastreamer2
这是一个支持多种平台的轻量级的流技术引擎,主要适合于开发语音和视频电话应用程序。该引
擎主要为 linphone 的多媒体流的收发,包括语音和视频的捕获、编码解码以及渲染。
2 ortp2
Ortp是一个 RTP 库。为基于 RTP 协议的媒体流传输提供支持。通过 mediastream2 编码的数据就
是使用 ortp 库发送到网络的另一端。
3 eXosip2
Exosip2为 sip 协议的实现。这部分实际上是由 exosip2 和 osip2 两个库共同完成的。使用 sip 协议
完成路由、媒体协商以及会话的建立和管理,为直接的媒体流的传输提供基础。
二 linphone 系统框图
网络接口
用户界面
Sip msg
接收
Sip msg
发送
系统运行框图
Ict exec
Exosip任务
Read msg
Ist exec
Nict exec
Nist exec
Ms/
ticker/
audio
Linphone core
任务
iterate
process
Rtp recv
filters
Rtp send
filters
Hard-
read
Hard-
read
Ms/
ticker/
vudio
Rtp recv
filters
Rtp send
filters
hard hard
Rtp
接收
Rtp
发送
Rtp
接收
Rtp
发送
Sip
sal_iterate
Audio stream
process
Vedio stream
process
关于上面框图的一些说明:
通话双方在通信前使用 exosip 进行会话协商。上图左边部分展示这一部分的流程。Exosip 后台
任务完成数据的接收和发送,并通过事件队列通知 linphone 底层的状态变化。
filter 的构建在会话协商成功建立后就顺带完成了,并且 ticker 任务也跑起来了。此时按照 filter
graphics 构建的通道,音视频流不断的从硬件设备上读取,并经过编码压缩送给 RTP 会话,之后送
到对端,对端到达的音视频流也经过 RTP 会话接收送到解码解压缩 filter,还原出原始的音视频流交
给硬件设备播放。媒体数据在这两路流中源源不断的流动,完成了双方的可视通话。
上层 linphone 的 core 任务也不断的对底层进行迭代检查。所做的基本工作如下:
对于 sip 协议部分,core 一直等待从事件队列上拿事件。这些事件是 exosip 任务在处理 sip 消息
过程中添加到事件队列上的。每当得到新的事件后,core 就从应用层的角度出发,进行处理。
对于视频流:基本上只处理 rtcp 数据包到达的事件。stream 上也有一个事件队列,用于保存该流
上的相关事件。对于 rtcp 数据包事件,core 也只处理 sr 类型 rtcp 包,即发送端报告,得到 jitter 和
包丢失率。如果设置了自适应比特率,则调用相关接口进行处理。此过程不断进行,直到当前事件
上的包处理完。
对于音频流,检查流是否还是活动的。通过比较 RTP stats 中接收的数据包数目是否发生变化,
如果在超时时间到达后,接收的数据量还没有发生变化,则认为音频没有响应。
三 linphone 中各个模块说明
1 Linphone coreapi 中子模块说明:
Coreapi 中的各个模块就是上层的处理模块,包括 configure 文件的处理接口,address 的处理接口,
chat 的处理接口,sal 的处理接口,proxy 的处理接口,
authorization 的处理接口,friends 的处理接口,
callback 的处理接口,state 的处理接口,杂项处理接口等。这相当于高层的几个模块,提供给用户
的接口调用主要都在 linphonecore.c 中
1) Callback 模块:
该模块下的回调函数都是用于 sal 模块调用的。当 sal 处理完 sip 协议的处理后,就会调用相应
的 callback 函数继续后续的处理,包括启动一个音视频传输流,启动响铃等。也就是说这里的 callback
完成了 media 媒体层的处理以及 linphone 上层的处理。
回调函数被保存在全局变量 linphone_sal_callbacks 中,在linphone 初始化时调用 sal_set_callbacks
设置到 sal 的 callback 上去的。
2) Genera_stat 模块:
主要提供 linphone 全局状态的修改与设置的接口
3) Address 模块:
调用 sal 提供的接口,进行与地址相关的处理,这里的地址主要是 uri 相关的处理。包括获取地
址以及地址中的部分信息或者设置这些信息。在上层地址是一个字符串指针,但是在内部处理时都
会强制转换为 osip_from 结构体来处理。实际上就是对 linphone_address 结构体的处理。
4) Authorization 模块:
处理认证信息。各个认证用户的信息都被保存到 linphone_auto 结构体中兵串接在 linphone_core
结构体上。这里的接口就是处理这些数据结构,提供设置和获取相关信息的接口。
5) Chat 模块:
提供创建和销毁 chat room,向 chat room 发送消息和从 chat room 接收消息的接口,以及设置和
获取用户数据的接口。类似于 authorization 模块,所有的 chat room 信息也是保存在
linphone_chat 结
构体中并串接在 linphone_core 结构体上的。
6) Friends 模块:
提供处理 friends 相关信息的接口。所有的 friends 信息保存在 linphone_friend 结构体中并被串接
在 linphone_core 结构体上,这样操作起来,包括设置,获取,添加以及移除都很方便。
7) Configure 模块:
提供配置文件处理的相关接口,包括配置文件的解析,配置文件中信息的获取,写入,同步等。
配置文件解析后便于程序处理的信息主要都保存在 lpconfig 结构体中,这与文本文件中便于编写和
阅读的配置文件本身不同。
配置文件中的各个配置模块本身也按照 section 的方式进行了划分,各个 section 也都是挂接在
lp_config 的 section 链表上的。这个模块可以单独提取出来进行测试。
8) Offer_answer 模块:
管理基于 sdp 的媒体协商。根据本地的支持能力和远端支持的能力,根据就低的原则,获得双方都
可以支持的媒体信息。比如编解码格式等。
9) Presence 模块:
提供与在线状态相关的处理。
10) Proxy 模块:
处理代理相关的处理。代理相关的信息保存在 linphone_proxy 结构体上,但是该结构体只是代
表了当前 linphone_core 使用的 proxy。代理可能不止一个,所有的代理其信息都被串接在链表上,
并被挂接在 sip_conf 的 proxies 上。添加一个代理,取得一个代理以及其他相关的操作接口也都在该
模块中提供处理接口。
11) Sal 模块:
Sal模块其实应该是最重要的,最核心的模块了。该模块对 exosip 进行了简单的封装,间接的
对 osip 模块进行了封装,使用该模块的接口可以完成 sip 协议的处理以及媒体描述的处理。
Sal.c 文件主要是对一些 sal 相关的结构体的操作,包括 SalMediaDescription 和 sal_op。处理包括
创建这些结构体的实例,获取或者设置其中的一些操作域。
Sal_exosip2_sdp.c 基于 osip 库提供的 sdp 相关操作的接口,在 sal 层实现将其与 sal 相关的结构
体关联起来操作。比如根据 SalMediaDescription 结构体信息将其转换为 sdp 结构体,或者反之。
Sal_exosip2_presence.c 包括了对 in 和 out 的 subscribe 的操作。Text 数据的发送(基于 osip 和
exosip)。
Sal_exosip2.c sip 这块比较重要的封装。包含了对 sal_op 结构体的创建和基本操作。对 exosip 重
要结构体的封装,包括初始化和释放。包含了对 sal 结构体的创建和基本操作的封装,更重要的是
包含了对 sal 和 sal_op,sal_media_desc,sal_stream_desc 这些上层结构体与底层 osip_message,
sip_message,sdp_message 等数据结构之间数据的转换和共享,以及对底层相关接口的调用。这种
调用主要包括跟据上层结构体中包含的信息设置底层结构体,并调用底层接口完成具体功能,以及
根据底层结构体得到的数据设置上层结构体的相关信息。
一个基本的描述就是:sal 作为 signal abstract layer 包含了上层所主要理解的交互信息,这些信
息对于理解电话操作而言已经足够了,在底层,选择了 osip 和 exosip 来支持这项操作。所以实际上
来说,可以用其他支持 sip 的库的接口来替代现有的,保留 sal 层接口的功能定义。在 linphone 中,
虽然大部分使用了 sal 层的封装来完成 sip 交互过程,但是也调用 osip 和 exosip 库本身的其他接口,
所以这层封装主要还是再次简化协议层的处理,使得功能更具体,而不是更单一。
几个关键数据结构之间的关系:
Sal 一个基本的结构体,通过这个结构体可以搜寻到上层所需的所有 sip 协议相关的信息。具体
的 call,register 等信息保存在 sal_op 这个结构体中,多个实体通过链表串接起来,挂在 sal 上。Sal_op
包含了 sal_op_base 结构体,这个结构体保存了一些通用的不变的信息,对多个实体而言,比如路由
信息,本地媒体信息,远端媒体信息等。其 root 指针由返回指向了 sal 这个基础,所以通过 sal_op
可以找到 sal。另外,在媒体信息中包含了所有流的信息,所有这些类似一个树的组织结构,sal 类
似树根,通过它可以找到所有的枝叶及其上的信息。这些数据结构之间的关系如下图:
剩余42页未读,继续阅读
云飞扬分享
- 粉丝: 0
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 27页智慧街道信息化建设综合解决方案.pptx
- 计算机二级Ms-Office选择题汇总.doc
- 单链表的插入和删除实验报告 (2).docx
- 单链表的插入和删除实验报告.pdf
- 物联网智能终端项目设备管理方案.pdf
- 如何打造品牌的模式.doc
- 样式控制与页面布局.pdf
- 武汉理工Java实验报告(二).docx
- 2021线上新品消费趋势报告.pdf
- 第3章 Matlab中的矩阵及其运算.docx
- 基于Web的人力资源管理系统的必要性和可行性.doc
- 基于一阶倒立摆的matlab仿真实验.doc
- 速运公司物流管理模式研究教材
- 大数据与管理.pptx
- 单片机课程设计之步进电机.doc
- 大数据与数据挖掘.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论19