库的编译安装

文章介绍了如何在Linux环境下安装和使用JRTPLib库,包括设置服务器和客户端的RTP会话,发送和接收RTP数据包,以及不同接收模式的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qq_42475191

谢谢老板

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

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

打赏作者

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

抵扣说明:

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

余额充值