天天看點

jrtplib程式設計步驟文檔代碼解析

調用jrtplib程式設計基本步驟:

這是jrtplib庫中參考文檔的解析

1.建立RTPSession對象

   RTPSession    s e s s i o n ;

2.設定兩個參數RTPSessionParams、RTPUDPv4TransmissionParams

  RTPSessionParams  s e s s ionparams ;

  s e s s ionparams . SetOwnTimestampUnit ( 1 . 0 / 8 0 0 0 . 0 ) ;//設定時間戳  以秒為機關

                                                                                                 8000是指1s采集8000個位元組

  RTPUDPv4TransmissionParams t ransparams ;

  t ransparams . Se tPor tbas e ( 8 0 0 0 ) ;//設定本地的端口 

3.建立函數

int  s t a t u s = s e s s i o n . Create ( s e s s ionparams ,&t ransparams ) ;//利用上面兩個參數建立

i f ( s t a t u s < 0)

{

s td : : c e r r << RTPGetErrorString ( s t a t u s ) << s td : : endl ;//擷取錯誤資訊并輸出顯示

e x i t (−1);

}

4.添加位址

u i n t 8 t  l o c a l i p [ ]={ 1 2 7 , 0 , 0 , 1 } ;

RTPIPv4Address addr ( l o c a l i p , 9 0 0 0 ) ;//發送到目标機的IP和端口

s t a t u s = s e s s i o n . AddDes t inat ion ( addr ) ;//添加位址,此處可以添加多個,像多個位址發送

i f ( s t a t u s < 0)

{

s td : : c e r r << RTPGetErrorString ( s t a t u s ) << s td : : endl ;

e x i t (−1);

}

5.設定RTP參數  這裡的參數設定的是預設參數,就是說将RTP設定預設參數,以後調用發送的時候預設這三個參數

  的值就是預設的了,為了友善寫send的,不用send的時候再添加後面的三個參數了

s e s s i o n . SetDefaul tPayloadType ( 9 6 ) ;設定rtp payload

s e s s i o n . SetDefaultMark ( fal s e ) ;

s e s s i o n . SetDefaultTimestampIncrement ( 1 6 0 ) ;//設定時間戳增量  20ms*8000HZ(Byte/s),每個塊增加160

                                                                                 是以說每個包160位元組,每個采樣周期時間戳+1

                                                                                 不同負載格式,RTP時間戳會以不同的速率增長

6.發送資料

u i n t 8 t s i l e n c e b u f f e r [ 1 6 0 ] ;

for ( int i = 0 ; i < 160 ; i++)

        s i l e n c e b u f f e r [ i ] = 12 8;

RTPTime de lay ( 0 . 0 2 0 ) ;聲明一個20ms的RTPTime參數

RTPTime s t a r t t ime = RTPTime : : CurrentTime ( ) ;//擷取當時時間

bool done = fal s e ;

while ( ! done )

{

s t a t u s = s e s s i o n . SendPacket ( s i l e n c e b u f f e r , 1 6 0 ) ;//發送資料包

i f ( s t a t u s < 0)

{

s td : : c e r r << RTPGetErrorString ( s t a t u s ) << s td : : endl ;

e x i t (−1);

}

//

// Ins p e c t incoming data here這裡可以添加接收的代碼,下面介紹

//

RTPTime : :Wait ( de lay ) ;//20ms延時

RTPTime t = RTPTime : : CurrentTime ( ) ;

t −= s t a r t t ime ;

i f ( t > RTPTime ( 6 0 . 0 ) )//因為這裡沒有設定發送多少個資料包,什麼時候停止是

                                             靠一分鐘這個時間規定的,就是說發送接收超過一分鐘就停止

done = true ;

}

7.接收資料

s e s s i o n . BeginDataAccess ( ) ;//接收資料要在這個start和end之間,相當于上了個鎖,防止poll線程在此期間訪                                                         問source table(每個參與者的獨立媒體流),因為接受資料其實是poll線程一直在                                                       背景搜尋發過來的資料源

i f ( s e s s i o n . GotoFi r s tSour c e ( ) )//找到第一個資料源,有可能是音視訊,有兩個資料源,先找到第一個的

{

do

{//這裡可以添加接收模式,就是什麼樣的資料接收什麼樣的不接受,預設全部接收

RTPPacket ∗ packet = s e s s i o n . GetNextPacket ( ) ;//抽取資料報函數

i f ( packet )

{

s td : : cout << ”Got packet with extended s equenc e number ”//列印資料報

<< packet−>GetExtendedSequenceNumber ( )

<< ” from SSRC ” << packet−>GetSSRC( )

<< s td : : endl ;

delete packet ;//接收完後及時釋放

}

} while ( s e s s i o n . GotoNextSource ( ) ) ;//再接收第二個資料源,沒有就退出

}

s e s s i o n . EndDataAccess ( ) ;

//其實在接收資料前應該先調用poll函數在背景線程周遊查詢發送過來的資料包,文檔裡沒寫到

8.銷毀退出

de lay = RTPTime ( 1 0 . 0 ) ;

s e s s i o n . BYEDestroy ( delay , ”Time ’ s up” , 9 ) ;//發送RTCP,等待delay時間如果不發送就退出,發送完也退出,因為RTCP得發送時沒有時間規律的,是以這裡設定時間,如果一直不發不設定時間就會卡在這裡了

jrtplib中的rtcp不是使用者控制的,自動發送的