jrtplib编程步骤文档代码解析
2014-06-01 21:31
253 查看
调用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不是用户控制的,自动发送的
这是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不是用户控制的,自动发送的
相关文章推荐
- WEB编程开发常用的代码[转载于CSDN文档中心]
- 文档解析影响了向上滚动的代码
- Java根据word模板生成word文档之后台解析和实现及部分代码(三)F
- Quartz 2D编程指南(14) - PDF文档解析
- xml解析(详细步骤及实例代码作为参考,理论部分请参阅互联网)之 SAXP (更新中)
- XMLDecoder 对xml文档的解析代码!
- 以前实习期间写的一段mfc编程,对数据库和xml格式文档的相关操作 主要相关代码 之三 导出数据库数据为xml格式自定义
- Java根据word模板生成word文档之后台解析和实现及部分代码(三)D
- Java根据word模板生成word文档之后台解析和实现及部分代码(三)C
- Qt下的OpenGL 编程(11)Qt实例hellogl代码解析
- 简单而强大的多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)
- 基于visual c++之windows核心编程代码分析(55)使用GoogleUrl方便安全地解析URL
- php编程实现获取excel文档内容的代码实例
- Java根据word模板生成word文档之后台解析和实现及部分代码(三)E
- Java根据word模板生成word文档之后台解析和实现及部分代码(二)
- 续实例解析SOCKET编程模型之异步通信篇(上) 代码
- php编程实现获取excel文档内容的代码实例
- ASP.NET实现word文档在线预览功能代码-JavaScript编程
- Quartz 2D编程指南(14)--PDF文档的解析
- 以前实习期间写的一段mfc编程,对数据库和xml格式文档的相关操作 主要相关代码 之一连接数据库