最简 jrtplib 收发数据实例

    jrtplib 的功能,在它的说明文档中有介绍:For applications such as a mixer or translator using the RTPSession class will not be a good solution. Other components can be used for this purpose: a transmission component, an SSRC table,an RTCP scheduler etc. Using these, it should be much easier to build all kinds of applications. 简单翻译过来就是它适合传输组件,SSRC表,RTCP调度等应用程序,但是并不适合做混合器和翻译器。

    在jrtplib的使用的时候,有下面的几点需要被别注意:

    (1)端口不能是奇数,否者运行时会出现错误:

        ERROR: The specified port base is not an even number

    (2)默认编译的jrtplib是没有打开宏RTP_SUPPORT_THREAD 

        也就是在接收数据的时候,它不会自动的查询是否接收到数据,需要在应用程序中添加轮询函数:sess.Poll()

jrtplib_receive.cpp 代码:

/*=============================================================================  
 *     FileName: jrtplib_receive.cpp  
 *         Desc: receive packet and print out the payloaddata    
 *       Author: licaibiao  
 *   LastChange: 2017-04-10  
 * =============================================================================*/
#include <jrtplib3/rtpsession.h>
#include <jrtplib3/rtpudpv4transmitter.h>
#include <jrtplib3/rtpipv4address.h>
#include <jrtplib3/rtpsessionparams.h>
#include <jrtplib3/rtperrors.h>
#include <jrtplib3/rtplibraryversion.h>
#include <jrtplib3/rtppacket.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>

using namespace jrtplib;

void checkerror(int rtperr)
{
	if (rtperr < 0)
	{
		std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
		exit(-1);
	}
}

int main(void)
{	
	RTPSession sess;
	uint16_t portbase = 6664;
	int status;
	bool done = false;

	RTPUDPv4TransmissionParams transparams;
	RTPSessionParams sessparams;
	sessparams.SetOwnTimestampUnit(1.0/10.0);		
	
	sessparams.SetAcceptOwnPackets(true);

	transparams.SetPortbase(portbase);
	status = sess.Create(sessparams,&transparams);	
	checkerror(status);

	sess.BeginDataAccess();
	RTPTime delay(0.020);
	RTPTime starttime = RTPTime::CurrentTime();
	
	while (!done)
	{
		status = sess.Poll();
		checkerror(status);
			
		if (sess.GotoFirstSourceWithData())
		{
			do
			{
				RTPPacket *pack;
				
				while ((pack = sess.GetNextPacket()) != NULL)
				{
					std::cout << pack->GetPayloadData() << std::endl;
					sess.DeletePacket(pack);
				}
			} while (sess.GotoNextSourceWithData());
		}
				
		RTPTime::Wait(delay);
		RTPTime t = RTPTime::CurrentTime();
		t -= starttime;
		if (t > RTPTime(60.0))
			done = true;
	}
	
	sess.EndDataAccess();
	delay = RTPTime(10.0);
	sess.BYEDestroy(delay,0,0);
    
	return 0;
}
    上面程序,以每0.02s的周期去查询是否有接收到数据,持续60s,接收到数据之后,将接收到的数据通过标准输出打印出来。

jrtplib_send.cpp 代码:

/*=============================================================================  
 *     FileName: jrtplib_send.cpp  
 *         Desc: sending packets to  destination port    
 *       Author: licaibiao  
 *   LastChange: 2017-04-10  
 * =============================================================================*/
#include <jrtplib3/rtpsession.h>
#include <jrtplib3/rtpudpv4transmitter.h>
#include <jrtplib3/rtpipv4address.h>
#include <jrtplib3/rtpsessionparams.h>
#include <jrtplib3/rtperrors.h>
#include <jrtplib3/rtplibraryversion.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>

using namespace jrtplib;

void checkerror(int rtperr)
{
	if (rtperr < 0)
	{
		std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
		exit(-1);
	}
}

int main(void)
{	
    int i;
    int num;
	int status;
    
	RTPSession sess;
	uint16_t portbase = 6666;  
    uint16_t destport = 6664;

#if 0
	uint32_t destip;	
	destip    = inet_addr("192.168.0.6"); 
	if (destip == INADDR_NONE)
	{
		std::cerr << "Bad IP address specified" << std::endl;
		return -1;
	}
	destip = ntohl(destip);
#else
	uint8_t destip[]={192,168,0,6};
#endif 

    std::cout << "Number of packets you wish to be sent:" << std::endl;
	std::cin >> num;
	
	RTPUDPv4TransmissionParams transparams;
	RTPSessionParams sessparams;
	
	sessparams.SetOwnTimestampUnit(1.0/10.0);		
	
	sessparams.SetAcceptOwnPackets(true);
	transparams.SetPortbase(portbase);
	status = sess.Create(sessparams,&transparams);	
	checkerror(status);
	
	RTPIPv4Address addr(destip,destport);
	
	status = sess.AddDestination(addr);
	checkerror(status);
	
	for (i = 1 ; i <= num ; i++)
	{
		printf("\nSending packet %d/%d\n",i,num);
		
		status = sess.SendPacket((void *)"1234567890",10,0,false,10);
		checkerror(status);		
		RTPTime::Wait(RTPTime(1,0));
	}
	
	sess.BYEDestroy(RTPTime(10,0),0,0);
    
	return 0;
}

    上面程序,通过标准输入确定需要发送数据的包数,然后以1s的周期发送数据。这里是p2p传输,发送之前需要指定发送地址和发送端口。这里的地址就是接收端主机的IP地址,这里的目的端口,就是接收端程序设置的本地端口。

Makefile文件:

APP = test
LINK_OPTS = -ljrtp
OBJ  = jrtplib_receive.cpp
#OBJ  = jrtplib_send.cpp
out: 
	g++ $(OBJ) -o $(APP)  $(LINK_OPTS)
clean:
	rm -rf *o $(APP)
编译执行部分结果:

发送端:

licaibiao@lcb:~/test/RTP/test_jrtplib$ ./test 
Number of packets you wish to be sent:
100

Sending packet 1/100

Sending packet 2/100

Sending packet 3/100

Sending packet 4/100

Sending packet 5/100

Sending packet 6/100

接收端:

licaibiao@ubuntu:~/test/RTP_TEST/JRTPLIB/biao$ ./test 
1234567890
1234567890
1234567890
1234567890
1234567890
1234567890
1234567890
1234567890 

    注意:在编译运行本程序之前,需要正确安装好jrtplib 

   工程代码可在这里下载:最简jrtplib 收发数据实例





    


  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
### 回答1: jrtplib是一个开源的RTP协议实现库,用于音视频数据传输。这个库提供的接口简单易用,开发人员可以利用它来开发音视频传输应用程序。 jrtplib支持RTP传输协议和RTCP控制协议,可以将音视频数据封装成RTP数据包进行传输,并在传输过程中进行丢包重传等错误处理,保证音视频数据的稳定传输。而RTCP协议则用于对RTP传输质量进行监控和统计,以及发送SRTCP密钥。 使用jrtplib进行音视频传输需要在程序中完成如下步骤: 1. 创建RTPSession对象,并设置传输参数,如IP地址、端口号等。 2. 创建RTPSession的发送端或接收端,设置对应的传输信息,如发送目标地址和端口号等。 3. 对于发送端,可以调用RTPSession的SendPacket函数,将音视频数据分片封装为RTP数据包,并发送到接收端。对于接收端,需要调用RTPSession的Poll函数,从接收缓存中读取RTP数据包,并进行解封装,得到原始的音视频数据。 4. 在传输过程中,可以根据需要进行丢包重传、重组分片等错误处理,以保证数据传输的正确性和稳定性。 总之,jrtplib为音视频传输程序提供了一个开源的高效实现框架,可以快速开发出稳定可靠的音视频传输应用。 ### 回答2: jrtp是一个C++的库,用于实现实时传输协议(RTP)和实时控制协议(RTCP)。该库提供了对媒体流传输的支持和管理,可以使用该库来开发各种实时应用程序,比如音视频会议、实时监控和直播等,具有很好的移植性和可扩展性。 jrtp库中包含了发送和接收RTP数据包的相关函数,可以直接用于实现视频或音频数据的传输,也可以通过修改代码实现其他数据类型的传输。其中,发送函数主要是构建RTP数据包并发送,接收函数主要是接收数据包并分析出其中的媒体信息,解析出的信息可以用于视频或音频的播放和处理。 jrtplib还提供了一些可选的功能,比如RTCP报告(用于数据传输质量的反馈)、NAT穿透、数据压缩、数据加密等,可以根据具体需求进行调用。 除此之外,jrtp还提供了一些示例程序和API文档,让开发者快速上手,更快地完成实时传输应用的开发工作。总的来说,jrtplib是一个开源、灵活、功能强大的实时传输库,可以帮助开发人员构建高效的实时应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

li_wen01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值