在jrtplib的GitHub官网上有5个示例,对照示例完成初步的认识会更加方便
MyRTPSession sess;
主要设置时间戳和本地端口:
时间戳音频通常为1.0/8000.0,视频通常为1.0/90000
RTPUDPv4TransmissionParams transparams;
RTPSessionParams sessparams;
uint16_t portbase; //本机端口号,为(1025~65535一个未使用的端口号)
transparams.SetPortbase(portbase);
/*设置时间戳,1/8000表示1秒钟采样8000次,即录音时的8KHz*/
sessparams.SetOwnTimestampUnit(1.0/8000.0);//其实这个是时间戳单位不是时间戳,也有sess.SetTimestampUnit(1.0 / 8000.0)这种设置方式)
//设置是不是接收自定义的数据包
sessparams.SetAcceptOwnPackets(true);
status = sess.Create (sessparams,&transparams);
//检查创建是否成功
checkerror(status);
tips: checkerror可以检错,函数如下
void checkerror(int rtperr)
{
if (rtperr < 0)
{
std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
exit(-1);
}
}
设置接收IP地址
RTP会话成功建立起来后,需要设置好数据发送的目标地址,RTP协议允许同一会话存在多个目标地址,这可以通过调用RTPSession类的AddDestination()、DeleteDestination()和ClearDestinations()方法来完成。
uint16_t destport; //目的端口号,例如6000、25000
uint32_t destip; //目的IP,例如本机为127.0.0.1
string ipstr;
destip = inet_addr(ipstr.c_str());
if (destip == INADDR_NONE)
{
std::cerr << "Bad IP address specified" << std::endl;
return -1;
}
//inet_addr返回一个基于网络字节序列,需要一个基于本机字节序列的,使用ntohl
destip = ntohl(destip);
RTPIPv4Address addr(destip, destport);
status = sess.AddDestination(addr);
checkerror(status);
/*还可以写成*/
unsigned long addr = ntohl(inet_addr("127.0.0.1"));
sess.AddDestination(addr, 6000);
数据发送
RTPSession类的SendPacket()方法,向所有的目标地址发送流媒体数据。SendPacket()是RTPSession类提供的一个重载函数,它具有下列多种形式:
int SendPacket(void *data,int len)
int SendPacket(void *data,int len,unsigned char pt,bool mark,unsigned long timestampinc)
int SendPacket(void *data,int len,unsigned short hdrextID,void *hdrextdata,int numhdrextwords)
int SendPacket(void *data,int len,unsigned char pt,bool mark,unsigned long timestampinc, unsigned short hdrextID,void *hdrextdata,int numhdrextwords)
Windows的编码
注意windows下使用需要windows的套接字文件
#include <WinSock2.h>
WSADATA dat;
WSAStartup(MAKEWORD(2, 2), &dat);
当然也不要忘记释放;
WSACleanup();