調用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不是使用者控制的,自動發送的