1.jrtplib库
先安装jthread,再安装jrtplib
下载:
jrtplib linux编译,rtplib在linux上的编译安装_Jeckaijew的博客-优快云博客
直接默认安装,有个pc文件忘记咋设置了
服务端:
//testrtcp.cpp
#include "rtpsession.h"
#include "rtpudpv4transmitter.h"
#include "rtpipv4address.h"
#include "rtperrors.h"
#include "rtpsessionparams.h"
#include <iostream>
#define SERVER_PORT 6000
#define SERVER_IP "127.0.0.1"
#define CLIENT_PORT 8000
#define CLIENT_IP "127.0.0.1"
using namespace jrtplib;
void checkerror(int rtperr){
if (rtperr < 0){
std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
exit(-1);
}
}
/// @brief "include_path":"/usr/local/include/jrtplib3",
/// @param "libs_path":"/usr/local/lib",
/// @return "lib":"ljrtp"
//g++ jrtplib_test.cpp -o jrtplib_test -I/usr/local/include/jrtplib3 -L/usr/local/lib -ljrtp
int main(void){
// 打印JRTPLIB版本
std::cout << "Using version " << RTPLibraryVersion::GetVersion().GetVersionString() << std::endl;
RTPSession sess; //创建一个会话
//unsigned long addr = ntohl(inet_addr(SERVER_IP));
//创建传输参数和会话参数
RTPUDPv4TransmissionParams transparams;
RTPSessionParams sessparams;
sessparams.SetOwnTimestampUnit(1.0/8000.0);//设置采样间隔 设置时间戳单位:s 1秒钟8000个样本
sessparams.SetAcceptOwnPackets(true);//设置是否接收属于本身的数据,true-接收,false-不接收
sessparams.SetUsePredefinedSSRC(true); //设置使用预先定义的SSRC
transparams.SetPortbase(SERVER_PORT);//设置接收端口
sessparams.SetUsePollThread(false);//设为了true则会话将使用一个线程池自动的处理收到的数据以及在需要的时候发送RTCP数据包
sessparams.SetMaximumPacketSize(1500);//设置RTP数据包的最大大小
//创建会话
int status = sess.Create(sessparams,&transparams);
// 写入IPv4地址和端口
RTPIPv4Address addr(ntohl(inet_addr(CLIENT_IP)),CLIENT_PORT);
//将目标地址 addr 加入到 RTP 会话的接收列表,表示接收从该地址发送的 RTP 数据包。
sess.AddToAcceptList(addr);
//添加目标地址,加入到 RTP 会话的目标地址列表,表示将 RTP 数据包发送给该地址
status = sess.AddDestination(addr);
checkerror(status);
//设置RTP接收模式为AcceptAll,该模式允许接收所有传入的RTP数据包。
status = sess.SetReceiveMode(RTPTransmitter::AcceptAll);
/*//负载类型、标识和时戳增量
sess.SetDefaultTimestampIncrement(3600);//设置时间戳增加间隔
sess.SetDefaultPayloadType(96);
sess.SetDefaultMark(true);
*/
char buffer[100];
//sess.SendPacket(buffer, 5, 0, false, 10);///sess.SendPacket(buffer, 5);
sess.SetDefaultPayloadType(0); sess.SetDefaultMark(false); sess.SetDefaultTimestampIncrement(10);
//sess.SendPacket(buffer, 5);
/*S
SendRawData方法用于直接发送原始的RTP数据,不对数据进行封包处理。这意味着用户必须自行确保传入的数据符合RTP格式,
包括正确设置RTP头信息、负载类型、时间戳等。JRTP库不会对数据进行任何修改或封装,而是直接将原始数据发送出去。这种方法
适用于那些已经对RTP格式非常熟悉且需要精细控制数据内容的开发者。使用SendRawData时,开发者需要负责所有RTP协议相关的细节。
SendPacket:
SendPacket方法用于发送经过JRTP库封装的RTP数据包。这意味着JRTP库会自动处理RTP头信息、负载类型、时间戳等,并将数据封装成
符合RTP格式的数据包,然后再发送出去。这种方法更适用于那些希望简化RTP数据包发送过程、不需要深入了解RTP协议细节的开发者。JRTP库
会自动处理RTP数据包的格式,让开发者能够更专注于业务逻辑。
*/
/*接收
JRTPLIB-3.11中修改PollData()方法为Poll()
可以通过调用 RTPSession 类的GotoFirstSource() 和 GotoNextSource() 方法来遍历所有的源,也可以通过调用 RTPSession
类的GotoFirstSourceWithData() 和 GotoNextSourceWithData() 方法来遍历那些携带有数据的源
调用 RTPSession 类的 GetNextPacket() 方法从中抽取 RTP 数据报,当接收到的 RTP 数据报处理完之后,一定要记得及时释放。
三种接收模式:
RECEIVEMODE_ALL 缺省的接收模式,所有到达的 RTP 数据报都将被接受;
RECEIVEMODE_IGNORESOME 除了某些特定的发送者之外,所有到达的 RTP 数据报都将被接受,而被拒绝的发送者列表可以通过调用
AddToIgnoreList()、DeleteFromIgnoreList() 和 ClearIgnoreList() 方法来进行设置;
RECEIVEMODE_ACCEPTSOME 除了某些特定的发送者之外,所有到达的 RTP 数据报都将被拒绝,而被接受的发送者列表可以通过调用
AddToAcceptList ()、DeleteFromAcceptList 和 ClearAcceptList () 方法来进行设置。
*/
for (int i = 1 ; i <= 10 ; i++)
{
printf("\nSending packet %d/%d\n",i,10);
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;
}
客户端:
/*=============================================================================
* 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>
#define CLIENT_PORT 8000
#define CLIENT_IP "192.168.1.1"
using namespace jrtplib;
void checkerror(int rtperr)
{
if (rtperr < 0)
{
std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
exit(-1);
}
}
int main(void)
{
RTPSession sess;
RTPSessionParams sessparams;
RTPUDPv4TransmissionParams transparams;
sessparams.SetOwnTimestampUnit(1.0/8000.0); //设置采样间隔
sessparams.SetAcceptOwnPackets(true);//设置是否接收属于本身的数据,true-接收,false-不接收
transparams.SetPortbase(8000);
int status = sess.Create(sessparams,&transparams);
checkerror(status);
sess.BeginDataAccess();//开始访问RTP数据。在接收RTP数据之前,必须调用这个函数
RTPTime delay(0.020);
RTPTime starttime = RTPTime::CurrentTime();
bool done = false;
while(!done)
{
status = sess.Poll();
checkerror(status);
if (sess.GotoFirstSourceWithData())//将迭代器定位到第一个有数据的RTP源
{
do
{
RTPPacket *pack;
//GetNextPacket获取下一个RTP数据包,并通过OnRTPPacket函数进行处理
while ((pack = sess.GetNextPacket()) != NULL)
{
std::cout << pack->GetPayloadData() << std::endl;
sess.DeletePacket(pack);//处理完后,通过DeletePacket函数删除已处理的数据包,确保内存不被泄漏。
}
} while (sess.GotoNextSourceWithData());
}
RTPTime::Wait(delay);
RTPTime t = RTPTime::CurrentTime();
t -= starttime;
if (t > RTPTime(60.0))
done = true;
}
sess.EndDataAccess();//结束对RTP数据的访问
delay = RTPTime(10.0);
sess.BYEDestroy(delay,0,0);
return 0;
}