1) 初始化
在使用 JRTPLIB 進行即時資料流媒體資料轉送之前,首先應該產生 RTPSession 類的一個執行個體來表示此次 RTP 會話,然後調用 Create() 方法來對其進行初始化操作。 RTPSession 類的 Create() 方法只有一個參數,用來指明此次 RTP 會話所採用的連接埠號碼。
2) 資料發送
當 RTP 會話成功建立起來之後,接下來就可以開始進行流媒體資料的即時傳輸了。首先需要設定好資料發送的目標地址, RTP 協議允許同一會話存在多個目標地址,這可以通過調用 RTPSession 類的 AddDestination() 、 DeleteDestination() 和 ClearDestinations() 方法來完成。目標地址全部指定之後,接著就可以調用 RTPSession 類的 SendPacket() 方法,向所有的目標地址發送流媒體資料。 SendPacket() 最典型的用法是類似於下面的語句,其中第一個參數是要被發送的資料,而第二個參數則指明將要發送資料的長度,再往後依次是 RTP 負載類型、標識和時戳增量。
sess.SendPacket(buffer, 5, 0, false, 10);
對於同一個 RTP 會話來講,負載類型、標識和時戳增量通常來講都是相同的, JRTPLIB 允許將它們設定為會話的預設參數,這是通過調用 RTPSession 類的 SetDefaultPayloadType() 、 SetDefaultMark() 和 SetDefaultTimeStampIncrement() 方法來完成的。為 RTP 會話設定這些預設參數的好處是可以簡化資料的發送,例如,如果為 RTP 會話設定了預設參數:
sess.SetDefaultPayloadType(0);
sess.SetDefaultMark(false);
sess.SetDefaultTimeStampIncrement(10);
之後在進行資料發送時只需指明要發送的資料及其長度就可以了:
sess.SendPacket(buffer, 5);
3) 資料接收
對於流媒體資料的接收端,首先需要調用 PollData() 方法來接收發送過來的 RTP 或者 RTCP 資料報。由於同一個 RTP 會話中允許有多個參與者(源),因此既可以通過調用 GotoFirstSource() 和 GotoNextSource() 方法來遍曆所有的源,也可以通過調用 GotoFisstSourceWithDat() 和 GotoNextSourceWithData() 方法來遍曆那些攜帶有資料的源。在從 RTP 會話中檢測出有效資料來源之後,接下去就可以調用 RTPSession 類的 GetNextPacket() 方法從中抽取 RTP 資料報,當接收到的 RTP 資料報處理完之後,要及時釋放。下面的代碼示範了該如何對接收到的 RTP 資料報進行處理:
do{
sess.BeginDataAccess();
if (sess.GotoFirstSourceWithData())
{
do
{
RTPPacket *pack;
uint8_t *data;
size_t length;
if((outfile=open("/mnt/hgfs/download/temp1.YUV",O_WRONLY | O_CREAT | O_APPEND))<0)
{
perror("open outfile error");
return -1;
}
while ((pack = sess.GetNextPacket()) != NULL)
{
data=pack->GetPayloadData();
length=pack->GetPayloadLength();
if((write(outfile,data,length))<0)// 將接收到的圖片資訊寫入文中。
{
perror("write outfile error;");
return -1;
}
sess.DeletePacket(pack);
}
} while (sess.GotoNextSourceWithData());
}
sess.EndDataAccess();
close(outfile);
JRTPLIB 為 RTP 資料報定義了 3 種接收模組,通過調用 RTPSession 類的 SetReceiveMode() 方法可以設定下列這些接收模式:
RECEIVEMODE_ALL :預設的接收模式,所有到達的 RTP 資料報都將被接受;
RECEIVEMODE_IGNORESOME :除了某些特定的寄件者之外,所有到達的 RTP 資料報都將被接受,而被拒絕的寄件者列表可以通過調用 AddToIgnoreList() , DeleteFromIgnoreList() 和 ClearIgnoreList() 方法來進行設定;
RECEIVEMODE_ACCEPTSOME :除了某些特定的寄件者之外,所有到達的 RTP 資料報都將被拒絕,而被接受的寄件者列表可以通過調用 AddToAcceptList() , DeleteFromAcceptList 和 ClearAcceptList() 方法來進行設定。