對JRTPLIB的學習

1.下載軟件包 jthread-1.3.1.tar.bz2 和jrtplib-3.9.1.tar.bz2 。網址:http://research.edm.uhasselt.be/~jori/page/index.php?n=CS.Jrtplib

 

2. 下載cmake-2.8.0-win32-x86.exe ,編譯生成VS2008的工程文件,使jrtplib-3.9.1.tar.bz2 能在VS2008的環境中運行。

 

 

RTP通信的流程:

1.建立時間戳單元,這是通過調用RTPSession類的
SetTimestampUnit()方法來實現的,該方法同樣也只有一個參數,表示的是以秒爲單元的時戳單元。例如,當使用RTP會話傳輸8000Hz
採樣的音頻數據時,由於時戳每秒鐘將遞增8000,所以時戳單元相應地應該被設置成1/8000:
sess.SetTimestampUnit(1.0/8000.0);

2.建立會話,設置目標地址
當RTP 會話成功建立起來之後,接下去就可以開始進行流媒體數據的實時傳輸了。首先需要設置好數據發送的目標地址,
RTP協議允許同一會話存在多個目標地址,這可以通過調用RTPSession類的AddDestination()、
DeleteDestination()和ClearDestinations()方法來完成。例如,下面的語句表示的是讓RTP會話將數據發送到本地主
機的6000端口(注意:如果是需要發到另一個NAT設備後面終端,則需要通過NAT穿透,見後):

unsigned long addr = ntohl(inet_addr("127.0.0.1"));
sess.AddDestination(addr, 6000);

3.向目標地址發送數據
目標地址全部指定之後,接着就可以調用RTPSession類的SendPacket()方法,向所有的目標地址發送流媒體數據。SendPacket()是RTPSession類提供的一個重載函數,它具有下列多種形式:

int SendPacket(void *data,int len)
int SendPacket(void *data,int len,unsigned char pt,bool mark,unsigned long timestampinc)
int SendPacket(void *data,int len,unsigned short hdrextID,void *hdrextdata,int numhdrextwords)
int SendPacket(void *data,int len,unsigned char pt,bool mark,unsigned long timestampinc,
    unsigned short hdrextID,void *hdrextdata,int numhdrextwords)
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);

4.數據接收
對於流媒體數據的接收端,首先需要調用RTPSession類的PollData()方法來接收發送過來的RTP或者
RTCP數據報。由於同一個RTP會話中允許有多個參與者(源),你既可以通過調用RTPSession類的GotoFirstSource()和
GotoNextSource()方法來遍歷所有的源,也可以通過調用RTPSession類的GotoFirstSourceWithData()和
GotoNextSourceWithData()方法來遍歷那些攜帶有數據的源。在從RTP會話中檢測出有效的數據源之後,接下去就可以調用
RTPSession類的GetNextPacket()方法從中抽取RTP數據報,當接收到的RTP數據報處理完之後,一定要記得及時釋放。下面的代碼
示範了該如何對接收到的RTP數據報進行處理:
if (sess.GotoFirstSourceWithData()) {
  do {
    RTPPacket *pack;     
    pack = sess.GetNextPacket();     
    // 處理接收到的數據
    delete pack;
  } while (sess.GotoNextSourceWithData());
}
JRTPLIB爲RTP數據報定義了三種接收模式,其中每種接收模式都具體規定了哪些到達的RTP數據報將會被接受,而哪些到達的RTP數據報將會被拒絕。通過調用RTPSession類的SetReceiveMode()方法可以設置下列這些接收模式:
RECEIVEMODE_ALL  缺省的接收模式,所有到達的RTP數據報都將被接受;
RECEIVEMODE_IGNORESOME
  除了某些特定的發送者之外,所有到達的RTP數據報都將被接受,而被拒絕的發送者列表可以通過調用AddToIgnoreList()、
DeleteFromIgnoreList()和ClearIgnoreList()方法來進行設置;
RECEIVEMODE_ACCEPTSOME
  除了某些特定的發送者之外,所有到達的RTP數據報都將被拒絕,而被接受的發送者列表可以通過調用AddToAcceptList
()、DeleteFromAcceptList和ClearAcceptList ()方法來進行設置。


注:控制信息已高度封裝,或者也可由自己設定。
JRTPLIB
是一個高度封裝後的RTP庫,程序員在使用它時很多時候並不用關心RTCP數據報是如何被髮送和接收的,因爲這些都可以由JRTPLIB自己來完成。只要
PollData()或者SendPacket()方法被成功調用,JRTPLIB就能夠自動對到達的
RTCP數據報進行處理,並且還會在需要的時候發送RTCP數據報,從而能夠確保整個RTP會話過程的正確性。
而另一方面,通過調用RTPSession類提供的SetLocalName()、SetLocalEMail()、
SetLocalLocation()、SetLocalPhone()、SetLocalTool()和SetLocalNote()方法,
JRTPLIB又允許程序員對RTP會話的控制信息進行設置。所有這些方法在調用時都帶有兩個參數,其中第一個參數是一個char型的指針,指向將要被設
置的數據;而第二個參數則是一個int型的數值,表明該數據中的前面多少個字符將會被使用。例如下面的語句可以被用來設置控制信息中的電子郵件地址:
sess.SetLocalEMail("
[[email protected]@linuxgam.com][email protected]@linuxgam.com[/email]
",19);
在RTP 會話過程中,不是所有的控制信息都需要被髮送,通過調用RTPSession類提供的
EnableSendName()、EnableSendEMail()、EnableSendLocation()、EnableSendPhone
()、EnableSendTool()和EnableSendNote()方法,可以爲當前RTP會話選擇將被髮送的控制信息。

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