MEDIASTREAMER2分析研究
Ver 0.2
文档变更记录
日期
版本
作者
改动
session下载
1.目的
本次分析研究VOIP中流媒体部分,是为将来在企业通讯客户端中实现软电话来呼叫外部电话;外部电话通过IPPBX上的语音提示来呼叫本地软电话;软电话和普通电话互通;不同办公地点之间音视频传输;语音邮件等。
在分析开源代码的基础上,扩展流媒体在传输过程中的编码和优化流媒体通讯过程中的语音视频质量。
为满足上述目的,我们采用分析LINPHONE开源代码中流媒体部分,经过分析发现该流媒体部
分在功能上完全能满足上述目的。该框架比较小且非常灵活,完全可以通过二次开发来优化传输过程中的流媒体质量。
2.总体架构
2.1.概述
LINPHONE中流媒体处理分为2个部分MEDIASTREAMER2和ORTP,前者负责媒体流的处理后者负责流媒体如何安全可靠的传输.
关于MEDIASTREAMER2,以下简称MS。
MS和ORTP为二个项目文件,由于MS利用ORTP作为传输部分使用,因此在下面描述中认为ORTP是其中的一部分功能。
ORTP实现了RTP协议,提供良好的API访问功能.多种RTP格式支持;发送接收的实时调度;单线程支持多路媒体流;自适应的缓冲区算法;实现了RTCP。目前我们采用的是ORTP 0.16.1的最新版本.
2.2.总体描述
2.2.1.业务流程描述
同很多软终端一样,在MS中实现的业务流程基本一样。以下图描述了一个单向的处理。MS在传输过程中用一个全双工的session来传送视频或者音频,不管是本机还是远端主机,运行的都是同一个程序,一次只能选择一种payload。
     
以上为一完整的VOIP软终端的实现流程,采集语音和视频的信息,经过一定的编码,通过R
TP协议传输流媒体数据到网关(IPPBX),流媒体网关可能会对数据进行处理,也可能是直接连接流媒体,这时候对方可以接收流媒体的数据开始播放。这样就实现连单方的通话,把整个流程反过来就实现了一个完整的流媒体传输通道。
2.2.2.总体功能模块描述
MS的总体逻辑关系非常简单,它利用函数指针将一系列的FILTER组合起来,通过一个线程来调度这些FILTER上的函数指针。
                         
以上为整个MS的功能模块图,可以看出MS框架除了具有维护FILTER功能之外处理事情非常
少,它利用函数指针来管理这些FILTER,而这些FILTER之间的逻辑关系则通过系统启动的时候配置加载,也就是说如果实现一个电话软终端,我们可以根据SIP协议和对方协商的SDP配置包来决定我们来加载语音或者是视频流。
 
2.3.功能描述
根据总体功能模块描述分以下几个小的功能:
2.3.1.注册FILTER
注册分为二部分,一部分为RTP协议中的注册,由于ORTP基本上实现了RTP协议上的所有规范,在ORTP部分先要注册与协议相关的信息,而在MS部分则主要注册FILTER的ID;FILTER的函数指针;以及该函数指针和外部的API的调用关系。这部分要涉及到写程序,实现各种FILTER和外部函数之间的一一对应关系。
2.3.2.FILTER Link/执行
由于有太多的FILTER,我们无法确定所有用户之间通讯都采用一种编码的方式,而且FILTER之间的逻辑关系也无法确定,因此需要一个配置能决定我们采用的编码,FILTER之间的关系.基本上每个FILTER都具备一个入一个出的属性,但是在采集和播放的时候FILTER只有一个属性。
在FILTER LINK之前基本上决定了流媒体的类型,LINK之后我们又知道了每个FILTER之间的关系。但是我们在采集媒体信息的时候要设置声音效果,质量,回音处理等。所以FILTER还要提供一次性的方法来配置这些属性。在FILTER LINK之前通过函数指针来调用FILTER的附加函数指针,该调用方式一般是一次行为。非FILTER的标准函数指针。
2.3.3.循环执行 FILTER
这个功能非常重要,在上面定义了FILTER,定义了FILTER的先后逻辑关系.现在要通过一个线程来持续不断的处理这些逻辑.由于FILTER之间的关系通过一个非循环的双链表来关联. 这个过程并非连续循环执行,循环过程只是从队列头到队列尾的一个过程. 语音流程有2个队列头,一个以采集为起点到发送为终点;一个以接收为起点到播放为终点.而视频则不这样。该功能将在下面详细描述。
2.3.4.FILTER UNILIK
取消每个FILTER之间的关系。
2.3.5.RTP 发送/接收FILTER
MS通过对ORTP的封装,在调用的时候认为ORTP传输部分的FILTER,按照实现方式来说,我们可以采用其它的RTP传输库来做FILTER。通过ORTP库中集成的RTP库可以猜测,该功能是可以实现的。 
2.3.6.音频编解码FILTER
  音频的编码和解码一般为一对,在MS中支持的有g711u, g711a, speex gsm等编码,目前已经加入了G729A.,也能够通过动态的办法加载新的编码.
 
2.3.7.视频编解码FILTER
  视频的FILTER目前支持H263-1998, MP4V-ES, theora.同时也可以通过插件的方式来添加H264的编码,目前的库是X264。
2.3.8.音视频播放FILTER
  这个FILTER只是通过WINDOWS API来从设备上读数据和写数据到设备上.
2.3.9.音视频捕获FILTER
2.3.10.ORTP的功能描述     
多种RTP格式支持
ortp有一个RtpProfile的全局变量,该变量在ortp初始化的时候赋值,该变量中有一个PayloadType的数组,每个PayloadType对应一种媒体流,PayloadType中包含了媒体流的特性,包括名称,采样率,声音位数,静音格式,占用带宽等。这些定义都在avprofile.c中。其中的几个参数中,采样率用的比较多,主要用来计算实时性.。
发送接收的实时调度。
发送和接收主要是两个函数rtp_session_send_with_tsrtp_session_recv_with_ts。以rtp_session_recv_with_ts为例:内部接收数据使用的是rtp_session_recvm_with_ts,首先,会接收所有scoket上的数据,然后将rtp包存放在一个队列之中,一系列处理之后,有一个pthread_mutex_lock的线程锁,将线程锁住。此时,由rtp_scheduler_schedule线程进行调度(该线程在协议栈初始化)时创建。rtp_scheduler_schedule会遍历所有的media session(媒体流),然后判断其中的timestamp(时间戳),如果计算的时间到达,则让rtp_session_recvm_with_ts继续处理。