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


相关推荐

  • typora文章同步(跨平台)

    typora文章同步(跨平台)typora实现备份个人博客一、图片上传PicGo有提供默认的图床,可以直接使用,但是有上传的限制,有特定要求的可以自己配置github图床。1.配置github图床利用github搭建图床2.安装PicGo下载链接windows选择exe结尾文件即可mac选择dmg为后缀的文件安装的时候一路next即可。3.在picGo中配置使用github图床4.picGo设置开启时间戳重名防止图片上传出错ps:我当时一直传输失败,修改代理,重新生成厂库,toke

    2022年5月19日
    130
  • SQL Server 数据库学习「建议收藏」

    SQL Server 数据库学习「建议收藏」一、认识数据库1、数据库的基本概念2、数据库常用对象3、数据库的组成数据库主要由文件和文件组组成。数据库中所有的数据和对象都被存储在文件中。二、创建数据库1、创建数据库对象资源管理器—数据库——右击——新建数据库三、操作数据表与视图1、创建数据表空值:表示数据未知。非空值:数据列不允许空值。(1)选择一个数据库——展开表——…

    2022年8月20日
    4
  • 控制台打印图形_前端控制台打印

    控制台打印图形_前端控制台打印问题描述一、在控制台输出以星号打印的三角形思路:在外部使用循环语句执行5次每次打印1行,每行的内容分别为空格和星号,每行空格缩进的数量为5减去所在行数,星号的数量是所在行数的2倍减1。在内部使用循环语句首先打印空格,然后打印星号”*”,对应的打印次数用循环次数控制,打印星号之后就可以换行。publicstaticvoidmain(String[]args){ //打印图形, intn=5;//表示要打印几行 for(inti=1;i<=n;i++){//i表示每行

    2022年10月20日
    0
  • Castle ActiveRecord学习实践(6):延迟加载和使用Where子句

    Castle ActiveRecord学习实践(6):延迟加载和使用Where子句

    2021年7月22日
    58
  • 仓库管理(WMS)系统及其组成

    仓储管理系统(WMS)是一个实时的计算机软件系统,它能够按照运作的业务规则和运算法则,对信息、资源、行为、存货和分销运作进行更完美地管理,使其最大化满足有效产出和精确性的要求。详情连接地址:https://baike.baidu.com/item/%E4%BB%93%E5%82%A8%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F/3212656现代仓储管理系统…

    2022年4月4日
    47
  • 谷歌滚动条样式(滚动条样式按钮)

    有不少可以帮你修改Chrome默认滚动条样式的扩展,ScrollBarX就是其中的佼佼者,但是这个扩展在安装的时候提示说会存取所有的网站数据,这就让人感觉很难以接受了。其实咱们可以自己动手,丰衣足食。首先在自己的系统里找到如下这个.css文件:Windows:%LOCALAPPDATA%\Google\Chrome\UserData\Default\UserStyleSheets\…

    2022年4月17日
    38

发表回复

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

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