JRTPLIB (v2.9) - 指南

来源:互联网 发布:网络捕鱼技巧打法 编辑:程序博客网 时间:2024/04/28 02:18

1.   开始

1.1   创建一个session

为了能够用这个库做任何事情,你必需创建一个rtp session。首先你必需创建一个RTPSession类型的变量,然后调用它的Create方法。这个方法只有一个参数,指定session基于的端口。下面是示例

  #include "rtpsession.h"
  
  int main(void)
  {
    RTPSession sess;   
    sess.Create(5000);
    return 0;
  }

1.2    错误
如果session创建不成功发生错误怎么样办?在库中,所有的函数都有一个int返回值,如果发生错误将返回一个负值勤.于是你可以检测一个函数是否成功完成.库中有一个函数RTPGetErrorString,可以将int转换成大多数能够理解的错误信息.这个函数有一个将其它函数的返回值做为自己的参数,并且返回描述错误信息的字符串指针.下面是简单示例:

#include <stdio.h>
  #include "rtpsession.h"
  
  int main(void)
  {
   RTPSession sess;
   int status;
   char *msg;
   
   status = sess.Create(5000);
   msg = RTPGetErrorString(status);
   printf("%s/n",msg);
   return 0;
  }


1.3   其它初始化
由于时间戳的值对于各种计算是必需的,所以你可以需要去初始化这个参数.这个时间戳可以通过RTPSession方法函数SetTimestampUnit设置.这个函数有一个参数:the timestamp unit in seconds.例如,如果你用session去发送8000Hz 采样的音频,你可能通常用这个做为rtp时间戳单位。由于时间戳每秒增加8000,所以时间戳单位是1/8000秒。这个是库中默认使用的值。对于44100HZ采样,代码要设置成这样:
   sess.SetTimestampUnit(1.0/44100.0);

2.   发送和接收数据

2.1   指定目的地

在你发送数据这前,必需指定每个数据包发送的目的地。你可以用RTPSession 方法函数AddDestination指定,删除目的地,或都清除目的地。例如:

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

预先准备session将数据发到本地主机,端口为5000.注意nthol函数被使用是因为inet_addr返回一个网络字节序的地址,函数参数为主机字节序。

2.2   发送rtp包

当你已经输入RTP包的目的地后,你可以通过使用RTPSession的方法函数SendPacket将数据发送到目的地。这是一个重载函数,在一个版本里你必需传送RTP payload类型,‘mark’标志和时间戳增长做为参数。示例:

       sess.SendPacket("1234567890",10,0,false,10);
 第一个参数是要发送的数据,第二个是数据长度,接下来是payload类型和mark标志。最后一个参数指定时间戳增长数量。 

如果你经常需要同样的payload类型,'mark'标志和时间戳增长量,你可以用第二个版本的函数。在使用前你必需先指定这些参数的默认值。可以用RTPSession 方法函数SetDefaultPayloadType,SetDefaultMark和SetDefaultTimeStampIncrement来完成。然后,你可以用不带最后三个参数的SendPacket函数。例如,你可以默认值

   sess.SetDefaultPayloadType(0);
   sess.SetDefaultMark(false);
   sess.SetDefaultTimeStampIncrement(10);
 你可以通过下面这样,一样可以正确完成前面SendPacket的所做的。  

   sess.SendPacket("1234567890",10);

2.3   接收RTP包

首先,你需要调用RTPSession成员函数PollData基于这样的规则。这个函数处理进来的RTP和RTCP包。为了访问接收到的RTP包,你通常需要投迭代session中不同的参于都并且得到每一个数据包。你可以用GotoFirstSource和 GotoNextSource函数迭代参与者。如果你只对还没有得到数据感兴趣,你可以使用GotoFirstSourceWithData 和 GotoNextSourceWithData。如果源可以并且没有返回false上面所有的函数返回true。如果一个源可以,你可以用GetNextPacket函数从这个源中得到一个rtp包。当你不再需要它的时候,请务必删除它。这里有一个例子:

if (sess.GotoFirstSourceWithData())
   {
    do
    {
     RTPPacket *pack;
     
     pack = sess.GetNextPacket();
     
     // process packet
     
     delete pack;
     
    } while (sess.GotoNextSourceWithData());
   }

关于RTP包类描述,请查说参考手册(manual.txt)

2.4  接收模式
有三种接收模式。接收模式决定那个进来的包可以被接收,那个包被忽略。你可以设置接收模式通过使用RTPSession成员函数SetReceiveMode.
第一种模式,RECEIVEMODE_ALL是默认设置。当你已经启用这个模式后所有进来的包都被接收。
第二种模式,RECEIVEMODE_IGNORESOME接收所有进来的包除了从某些发送都送来的包。你可以通过使用 AddToIgnoreList, DeleteFromIgnoreList andClearIgnoreList来决定那些包被忽略。
第三种模式,RECEIVEMODE_ACCEPTSOME,忽略所有进来的包除了从某些发送者送来的包。你可以使用AddToAcceptList, DeleteFromAcceptList andClearAcceptList来决定那些包被接收。
AddToXXX函数和DeleteFormXXX函数带有三个参数。第一个是发送者的IP地址。第二个参数是标志。如果设置为true,所有来自于先前IP地址的数据包被接收或忽略,第三个参数可以不管。如果设置为false,第三个参数指定端口号。这种情况下,只有指定IP和端口才被忽略或接收。
An important note is that the port which has to be specified is the port from which the RTP packets originate and this does not have to be the RTP portbase.更重要的是,在这个库里那些端口是不一样的。可以使用GetSendPort函数找到被发送出去包的端口。

 

原创粉丝点击