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函数找到被发送出去包的端口。