当前位置: 首页 > 工具软件 > jrtplib > 使用案例 >

Windows下Jrtplib的使用

何楷
2023-12-01

Windows下Jrtplib的使用


在jrtplib的GitHub官网上有5个示例,对照示例完成初步的认识会更加方便

创建过程代码

初始化RTP会话

创建会话

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();
 类似资料: