1.开始
1.1 创建一个session
为了使用这个库,你首先需要构建一个session,类型为RTPSession,然后调用create()成员函数创建,它带有一个参数,是端口号,例子:
#i nclude "rtpsession.h"
int main(void)
{
RTPSession sess;
sess.Create(5000);
return 0;
}
1.2 错误
在这个库中,如果条拥有错误发生,所有的函数都会返回一个int 或者 false ,你可以通过调用RTPGetErrorString()函数来判断是否出错,有错,他会返回详细的错误信息,否则为0。例子:
#i nclude <stdio.h>
#i nclude "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(),单位是秒。
例如:你要发送8000赫兹的采样频率,你需要设置时间戳,由于它是每秒8000次增加,所以时间戳单元为1/8000,这也是这个库的默认设置。如果为44100赫兹,则如下:
sess.SetTimestampUnit(1.0/44100.0);
2 发送和接收数据
2.1 设置目的地址:
在你发送数据之前,必须指定包所要发送的目的地址。可使用的函数有AddDestination, DeleteDestination 和ClearDestinations。例如:
unsigned long addr = ntohl(inet_addr("127.0.0.1"));
sess.AddDestination(addr,5000);
既是将包发送到本机的5000端口上。Ntohl是将网络字节序转换为长整形。
2.2 发送RTP包
当已指定好包的目标地址后就可以发送了。调用成员函数SendPacket(),这是一个可以重载的函数,他有5种函数,可以指定发送的负载类型,标志符,时间戳增量,
如(其中的一种):
sess.SendPacket("1234567890",10,0,false,10);
参数1为发送的数据,2为数据长度,3为负载类型,4为标志符,5为时间戳增量。
如果你所要发送的数据的负载类型,标识符和时间戳增量是相同的,你可以使用另一种定义,
但是使用之前你必须为这些参数设置默认得值,课题通过调用成员函数SetDefaultPayloadType, SetDefaultMark 和SetDefaultTimeStampIncrement。这样你就可以在SendPacket()函数中不用设置后三个参数了。
sess.SetDefaultPayloadType(0);
sess.SetDefaultMark(false);
sess.SetDefaultTimeStampIncrement(10);
sess.SendPacket("1234567890",10);
2.3 接收数据包
首先你需要调用函数PollData(),这个函数是处理接受到的RTP和RTCP包,他会处理所有到达端口的包,因此你可以重复调用函数GotoFirstSource() 和 GotoNextSource()来遍历所有的源,如果你只是对各个源所携带的数据有兴趣,你可以调用GotoFirstSourceWithData 和 GotoNextSourceWithData来获取接收到的各个源的数据,所有以上函数调用成功返回值为真 ,否则是false,当一个源正在被处理时,你可以调用函数GetNextPacket()来获取下一个RTP数据包,但是使用完必须delete掉。例子:
if (sess.GotoFirstSourceWithData())
{
do
{
RTPPacket *pack;
pack = sess.GetNextPacket();
// process packet
delete pack;
} while (sess.GotoNextSourceWithData());
}
更多关于RTPPacket的信息看手册。
2。4 接受方式
JRTPLIB 为 RTP 数据报定义了三种接收模式,其中每种接收模式都具体规定了哪些到达的 RTP 数据报将会被接受,而哪些到达的 RTP 数据报将会被拒绝。通过调用 RTPSession 类的 SetReceiveMode() 方法可以设置下列这些接收模式:
RECEIVEMODE_ALL
缺省的接收模式,所有到达的 RTP 数据报都将被接受;
RECEIVEMODE_IGNORESOME
除了某些特定的发送者之外,所有到达的 RTP 数据报都将被接受,而被拒绝的发送者列表可以通过调用 AddToIgnoreList()、DeleteFromIgnoreList() 和 ClearIgnoreList() 方法来进行设置;
RECEIVEMODE_ACCEPTSOME
除了某些特定的发送者之外,所有到达的 RTP 数据报都将被拒绝,而被接受的发送者列表可以通过调用 AddToAcceptList ()、DeleteFromAcceptList 和 ClearAcceptList () 方法来进行设置。
2。5 多播
2。5。1 发送到一个多播组
要想加入一个多播组你不需要做个多的设定。只需要建立一个目的地指表或数组,RTP和RTCP包就会自动多播发送了。
唯一可能需要做的事情是设定数据包的Time To Live(TTL) (生存时间),他决定了一个数据包的存在时间,位于IP 头部,可以是用函数SetMulticastTTL来设定。
2。5。2 从多播网络接收数据
你必须首先加入一个多播网络才可以重中接收数据。使用函数JoinMulticastGroup, LeaveMulticastGroup 和LeaveAllMulticastGroups,他们是以IP为参数的。
2。6 关于接受和发送RTCP包
这个库可以很简单的处理RTCP信息,只要你正常调用PollData()函数,他会自动处理收到的RTCP信息,并对rtcp信息进行统计判断是否需要发送RR,而调用SendPacket()来决定什么时候发送RTCP 的SR包及其信息。
3 控制消息
3。1 自己的消息
通过调用 RTPSession 类提供的 SetLocalName()、SetLocalEMail()、SetLocalLocation()、SetLocalPhone()、SetLocalTool() 和 SetLocalNote() 方法,JRTPLIB 又允许程序员对RTP会话的控制信息进行设置。所有这些方法在调用时都带有两个参数,其中第一个参数是一个 char 型的指针,指向将要被设置的数据;而第二个参数则是一个 int 型的数值,表明该数据中的前面多少个字符将会被使用。例如下面的语句可以被用来设置控制信息中的电子邮件地址:
sess.SetLocalEMail("xiaowp@linuxgam.com",19);
在 RTP 会话过程中,不是所有的控制信息都需要被发送,通过调用 RTPSession 类提供的 EnableSendName()、EnableSendEMail()、EnableSendLocation()、EnableSendPhone()、EnableSendTool() 和 EnableSendNote() 方法,可以为当前 RTP 会话选择将被发送的控制信息。
3。2 其他消息
你可以通过函数GetCurrentSourceInfo() 获得当前消息源的信息,另外你可以首先获得源的SSRC,然后调用GetSourceInfo,参数为SSRC,获得源的信息。
4 句柄
You can specify handlers for certain types of events. For example: when a
source joins the session, when a source times out, when SSRC identifiers
collide, ...
For more information about the use of handlers you should take a look
at the reference manual (manual.txt)