jrtplib收发实例[通俗易懂]

jrtplib收发实例[通俗易懂]jrtplib的功能在它的说明文档中有介绍:ForapplicationssuchasamixerortranslatorusingtheRTPSessionclasswillnotbeagoodsolution.Othercomponentscanbeusedforthispurpose:atransmissioncomponent,anSSRCtable,anRTCPscheduleretc.Usingthese,…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

        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 收发数据实例

原文链接:https://blog.csdn.net/li_wen01/article/details/70045185

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164753.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux//unix实用基本命令小全

    linux//unix实用基本命令小全

    2021年4月27日
    123
  • 一代、二代、三代测序技术原理与比较「建议收藏」

    一代、二代、三代测序技术原理与比较「建议收藏」从1977年第一代DNA测序技术(Sanger法)1,发展至今三十多年时间,测序技术已取得了相当大的发展,从第一代到第三代乃至第四代,测序读长从长到短,再从短到长。虽然就当前形势看来第二代短读长测序技术在全球测序市场上仍然占有着绝对的优势位置,但第三和第四代测序技术也已在这一两年的时间中快速发展着。测序技术的每一次变革,也都对基因组研究,疾病医疗研究,药物研发,育种等领域产生巨大的推动作用。在这里我主要对当前的测序技术以及它们的测序原理做一个简单的小结。

    2022年5月17日
    90
  • 不会报错的Matlab2018a安装包[通俗易懂]

    不会报错的Matlab2018a安装包[通俗易懂]matlab2018a的百度云盘链接:https://pan.baidu.com/s/1972rkmKFw1xZLXfnYtNv-Q提取码:k6hc(永久有效)安装包内含有详细的安装教程的word文档。安装完如下:

    2022年6月3日
    30
  • 迁移学习与代码举例

    迁移学习出现背景在有监督的机器学习和尤其是深度学习的场景应用中,需要大量的标注数据。标注数据是一项枯燥无味且花费巨大的任务,关键是现实场景中,往往无法标注足够的数据。而且模型的训练是极其耗时的。因此迁移学习营运而生。传统机器学习(主要指监督学习)基于同分布假设需要大量标注数据然而实际使用过程中不同数据集可能存在一些问题,比如数据分布差异标注数据过期训练数据过期,也就是好不容易标定…

    2022年4月15日
    112
  • 鸿蒙OS架构及关键技术整理

    鸿蒙OS架构及关键技术整理鸿蒙OS架构及关键技术整理一. 鸿蒙OS整体介绍二. 子系统架构三. 关键技术1.分布式架构首次用于终端OS,实现跨终端无缝协同体验2.确定时延引擎和高性能IPC技术实现系统天生流畅3.基于微内核架构重塑终端设备可信安全4.通过统一IDE支撑一次开发,多端部署,实现跨终端生态共享四. 参考资料一. 鸿蒙OS整体介绍HarmonyOS简介原作者:xiangzhihong8前两天,华为发布了HarmonyOS2.0,俺也赶个时髦,给大家简单介绍下HarmonyOS。定义首先,我们来看一下官

    2022年7月12日
    9
  • python 时间格式(时间戳–格式化时间)的互相转换

    python 时间格式(时间戳–格式化时间)的互相转换

    2021年11月10日
    104

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号