jrtplib编程步骤文档代码解析

来源:互联网 发布:高仿充q币软件 编辑:程序博客网 时间:2024/06/07 22:41

调用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不是用户控制的,自动发送的










0 0
原创粉丝点击