oRTP库分析

一:关于 oRTP

oRTP 是一款开源软件,实现了 RTP 与 RTCP 协议。
目前使用 oRTP 库的软件主要是 linphone(一款基于 IP 进行视频和语音通话的软件)。
oRTP 作为 linphone 的 RTP 库,为基于 RTP 协议传输语音和视频数据提供保障。
 

二:源代码的构建框架

类似于 mediastream2 中的 filter,在 RTP 中也有比较重要的一个结构,就是 payload type,该结构用于指定编码类型,以及与其相关的时钟速率、采样率等一些参数,如下。
 

struct _PayloadType
{
	int type; /**< one of PAYLOAD_* macros*/
	int clock_rate; /**< rtp clock rate*/
	char bits_per_sample;	/* in case of continuous audio data */
	char *zero_pattern;
	int pattern_length;
	/* other useful information for the application*/
	int normal_bitrate;	/*in bit/s */
	char *mime_type; /**<actually the submime, ex: pcm, pcma, gsm*/
	int channels; /**< number of channels of audio */
	char *recv_fmtp; /* various format parameters for the incoming stream */
	char *send_fmtp; /* various format parameters for the outgoing stream */
	int flags;
	void *user_data;
};

实际上在 RTP 的包头就有专门的域用来定义当前传输的数据是什么编码类型的。在代码中,不同的媒体类型有不同的 payloadtype 结构体与之对应,像 h263, g729, MPEG4 等。因为每种编码都有其独有的特点,而且许多参数也不一样,所以 RTP 包头中使用 payload域标记负载的类型,一方面接收端可以就此判断负载的类型,从而选择对应的解码器进行解码播放;另一方面,代码在进行时间戳等方面的计算时可以更加方便一点。

Payloadtype 结构体定义了 payload 的许多属性,比如是音频还是视频数据,时钟采样率,每次采样的比特数,正常的比特率, MIME 类型,通道等等。代码中已有常见音视频编解码器对应的 payloadtype 结构体实现,应用程序在初始化 oRTP 库时,可以根据自己的需求,
选择其中的一部分添加到系统中。所有系统当前支持的 payload 类型都被放在一个数组中,由全局变量 av_profile 这个结构体实例统领,如下图所示:

这些 payloadtype 结构体在 payload 数组中的位置就是以编码类型的定义为索引的。编码类型值的定义在 RFC3551 第六部分“payload type definitions”进行了描述。

Avprofile.c 文件定义了所有的 payload type。而有关 payload type 和 profile 的操作在文件payloadtype.c 文件中实现。

除了 payloadtype 结构体外,一个更重要的结构体是 rtpsession。该结构体即是一个会话的抽象,与会话相关的各种信息都定义在该结构体上或者能够通过该结构体找到。要使用oRTP 进行媒体数据的传输,需要先创建一个会话,之后所有数据的传输都在会话上完成或
基于会话完成。 rtpsession 结构体的定义如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章