JRTP 編程模型

來源:互聯網
上載者:User

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() 方法來進行設定。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.