前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >jrtplib收发实例[通俗易懂]

jrtplib收发实例[通俗易懂]

作者头像
全栈程序员站长
发布2022-09-19 09:37:21
5790
发布2022-09-19 09:37:21
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

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 代码:

代码语言:javascript
复制
/*=============================================================================  
 *     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 代码:

代码语言:javascript
复制
/*=============================================================================  
 *     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文件:

代码语言:javascript
复制
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)

编译执行部分结果: 发送端:

代码语言:javascript
复制
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

接收端:

代码语言:javascript
复制
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.cn/164753.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档