1.linphone 包含的库
1 ReadLine 一个终端显示库, Linphone 会用到它时里面的事件循环机制来读取会话事件。
2 ffmpeg 音视频编解码库
3 Speex 专为通话过程设计的音频编码库
4 libtheora 视频压缩编码库
5 libfaac mpeg4 的音频编码器
6 libfaad2 AAC 音频解码器
7 SDL 简单的视频支持层
8 libosip2 SIP 的简单实现
9 libeXosip2 对 libosip2 的调用进行封装,隐藏了多媒体会话建立过程中 SIP 的细节
10 linphone-3.0 linphone 的主程序,包括 mediastream, oRtp, coreapi 以及 console 四个部分、
2.运行时候系统图为
通话双方在通信前使用 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 中接收的数据包数目是否发生变化,
如果在超时时间到达后,接收的数据量还没有发生变化,则认为音频没有响应。
3 LinphoneCore 结构体
/*
* Initialize linphone core
*/
linphonec=linphone_core_new (&linphonec_vtable, configfile_name, factory_configfile_name, NULL
//jimmy +++ linphonecore struct
struct _LinphoneCore
{
LinphoneCoreVTable vtable;
Sal *sal; //exosip
LinphoneGlobalState state;
struct _LpConfig *config;
RtpProfile *default_profile; //rtp payload
net_config_t net_conf;
sip_config_t sip_conf;
rtp_config_t rtp_conf;
sound_config_t sound_conf;
video_config_t video_conf;
codecs_config_t codecs_conf;
ui_config_t ui_conf;
autoreplier_config_t autoreplier_conf;
MSList *payload_types; //rtp payload
int dyn_pt;
LinphoneProxyConfig *default_proxy;
MSList *friends;
MSList *auth_info;
struct _RingStream *ring