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 結構體的定義如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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