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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 用一条SQL语句显示所有可能的比赛组合

    用一条SQL语句显示所有可能的比赛组合

    2021年11月22日
    38
  • 通过sql调用procedure_oracle存储过程简单案例

    通过sql调用procedure_oracle存储过程简单案例文章目录1.存储过程和函数在实际项目中的使用2.存储过程与函数的比较2.1.共同点2.2.不同点3.存储过程StoredProcedure3.1.存储过程概述3.1.1.存储过程的优点3.1.2.存储过程的缺点3.2.创建存储过程createprocedure3.3.调用存储过程call3.4.查看存储过程的定义3.5.修改存储过程alterprocedure…

    2022年10月5日
    2
  • Unity3D中使用Leap Motion进行手势控制[通俗易懂]

    Unity3D中使用Leap Motion进行手势控制

    2022年2月4日
    54
  • Arduino编程之Serial.println()和Serial.print()

    Arduino编程之Serial.println()和Serial.print()Arduino编程之Serial.println()和Serial.print()Arduino的输出基本就用两个函数print和println,区别在于后者比前者多了回车换行Serial.println(data)从串行端口输出数据,跟随一个回车(ASCII13,或’r’)和一个换行符(ASCII10,或’n’)。这个函数所取得的值与Serial.print()一样。Ser…

    2022年10月3日
    18
  • 异步fifo的10个测试关注点_异步FIFO

    异步fifo的10个测试关注点_异步FIFO1、异步FIFO简介及其原理FIFO是英文FirstInFirstOut的缩写,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据。异步FIFO是指读写时钟不一致,读写时钟是互相独立的。1.1用途用途1:  跨时钟域:异步FIFO读写分别采用相互异步的不同时钟。在现代集成电路芯片中,随着设计规模的不断扩大,一个系统中往往含有数个时钟,多时钟域带来的一个问题就是,如何设计异步时钟之间的接口电路。异步FIFO是这个问题的一

    2022年8月13日
    6
  • windows 设置定时锁屏

    windows 设置定时锁屏设置间隔指定时间电脑自动锁屏CreateTime–2017年7月3日10:16:14Author:Marydon参考地址:电脑爱好者杂志举例:实现每间隔45分钟,电脑自动锁屏实现思路:  第一步:编写锁屏命令;  第二步:制定计划。实践:  1.编写锁屏命令    新建一个txt文件,重命名为:lockScreen(名字随意)–>打开该文件添…

    2022年7月21日
    55

发表回复

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

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