一. 前言

JRTPLIB 是 C++ 语言编写的 RTP 库,它帮助我们封装了 RTP 协议细节,用户通过提供好的接口可以设置 RTP 包信息并发送到指定地址,也可以接收 RTP 包取出信息。

本文仅介绍如何使用 JRTPLIB 发送/接收 RTP 数据包,我在这篇博客又介绍了如何使用 JRTPLIB 构造 RTP 数据包来荷载 H264 码流数据。

二. 下载编译安装

git clone https://github.com/j0r1/JRTPLIB.git
cd JRTPLIB
cmake CMakeLists.txt
make
sudo make install

三. 代码实战

1. JRTPLIB接收RTP包程序

#include <jrtplib3/rtpsession.h>
#include <jrtplib3/rtplibraryversion.h>
#include <jrtplib3/rtpudpv4transmitter.h>
#include <jrtplib3/rtpsessionparams.h>
#include <jrtplib3/rtppacket.h>
#include <iostream>
#include <arpa/inet.h>using namespace jrtplib;void checkerror(int rtperr) {if (rtperr < 0) {std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;exit(-1);}
}int main() {std::cout << "Using JRTPLib version: " << RTPLibraryVersion::GetVersion().GetVersionString() << std::endl;uint16_t localport;std::cout << "Enter local port(even): ";std::cin >> localport;RTPUDPv4TransmissionParams tranparams;tranparams.SetPortbase(localport);RTPSessionParams sessparams;sessparams.SetOwnTimestampUnit(1.0 / 10.0);sessparams.SetAcceptOwnPackets(true);RTPSession sess;int status = sess.Create(sessparams, &tranparams);checkerror(status);RTPTime delay(0.020);RTPTime startTime = RTPTime::CurrentTime();bool done = false;while (!done) {sess.BeginDataAccess();if (sess.GotoFirstSourceWithData()) {do {RTPPacket* packet;while ((packet = sess.GetNextPacket()) != NULL) {std::cout << "Got packet!" << std::endl;std::cout << "SSRC: " << packet->GetSSRC() << std::endl;std::cout << "Payload data: " << packet->GetPayloadData() << std::endl;std::cout << "Payload type: " << packet->GetPayloadType() << std::endl;std::cout << "Packet length: " <<packet->GetPacketLength() << std::endl;std::cout << "Sequence number: " << packet->GetSequenceNumber() << std::endl;std::cout << "Timestamp: " << packet->GetTimestamp() << std::endl;std::cout << std::endl;sess.DeletePacket(packet);} } while (sess.GotoNextSourceWithData());}sess.EndDataAccess();RTPTime::Wait(delay);}sess.EndDataAccess();return 0;
}

编译后运行如上,设置本地监听端口后就会开始等待 RTP 数据。

2. JRTPLIB发送RTP包程序

#include <jrtplib3/rtpsession.h>
#include <jrtplib3/rtplibraryversion.h>
#include <jrtplib3/rtpudpv4transmitter.h>
#include <jrtplib3/rtpsessionparams.h>
#include <jrtplib3/rtppacket.h>
#include <iostream>
#include <arpa/inet.h>using namespace jrtplib;void checkerror(int rtperr) {if (rtperr < 0) {std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;exit(-1);}
}int main() {std::cout << "Using JRTPLib version: " << RTPLibraryVersion::GetVersion().GetVersionString() << std::endl;uint16_t localport;std::cout << "Enter local port(even): ";std::cin >> localport;std::string ipstr;std::cout << "Enter the destination IP address: ";std::cin >> ipstr;uint32_t destip = inet_addr(ipstr.c_str());if (destip == INADDR_NONE) {std::cerr << "Bad IP address specified" << std::endl;return -1;}// The inet_addr function returns a value in network byte order, but// we need the IP address in host byte order, so we use a call to// ntohldestip = ntohl(destip);uint16_t destport;std::cout << "Enter the destination port: ";std::cin >> destport;int num;std::cout << "Number of packets you wish to be sent: ";std::cin >> num;RTPUDPv4TransmissionParams tranparams;tranparams.SetPortbase(localport);RTPSessionParams sessparams;sessparams.SetOwnTimestampUnit(1.0 / 10.0);sessparams.SetAcceptOwnPackets(true);// Now, we'll create a RTP session, set the destination, send some// packets and poll for incoming data.RTPSession sess;int status = sess.Create(sessparams, &tranparams);checkerror(status);RTPIPv4Address destAddr(destip, destport);status = sess.AddDestination(destAddr);checkerror(status);sess.SetDefaultPayloadType(96);sess.SetDefaultMark(false);for (int i = 1;i <= num;++i) {std::cout << "Sending packet " << i << "/" << num << std::endl;status = sess.SendPacket((void*)"0123456789", 10, 0, false, 10);checkerror(status);RTPTime::Wait(RTPTime(1, 0));}sess.BYEDestroy(RTPTime(10, 0), 0, 0);return 0;
}

编译后运行如上,输入本地 UDP 使用的端口以及对端监听的端口,设置需要发送的 RTP 包数即可发送,发送后接收端打印的信息如下。

使用JRTPLIB收发RTP数据包相关推荐

  1. java 监听本地端口_Java-在本地端口上侦听RTP数据包

    因此,我目前正在开发一个客户端应用程序,该应用程序在端口5004上侦听RTP数据包.由于可能有多个服务器发送RTP数据包,因此我无法使用套接字连接到特定的远程主机.相反,我尝试了以下方法来侦听本地端口 ...

  2. 网络在20秒内没有下行RTP数据包,被叫终端主动中断VoLTE通话链路

    问题描述 被测终端在预定测试地点进行"语音数据业务并发的eSRVCC"测试时 终端A进行FTP上传和下载,数据业务在测试过程中一直保持: 终端A语音呼叫终端B,测试20次: 1次出 ...

  3. C#实现RTP数据包传输

    闲暇时折腾IP网络视频监控系统,需要支持视频帧数据包在网络内的传输. 未采用H.264或MPEG4等编码压缩方式,直接使用Bitmap图片. 由于对帧的准确到达要求不好,所以采用UDP传输.如果发生网 ...

  4. UDP传输rtp数据包丢帧

    udp丢包情况: 1.连续发送数据包太快 (每发一包数据usleep(40)); 2.发送数据包太长 (数据进行切割成1400byte发送): 3.接收端处理时间过长导致丢包:调用recv方法接收端收 ...

  5. stm32f103c8t6串口数据包收发

    硬件资源: 使用stm32f103c8t6单片机作为主控,CH340USB转串口模块进行串口数据收发,0.96寸支持IIC协议的显示屏进行效果显示. 接线图: 项目思路: ①:什么是串口数据包? 用来 ...

  6. 【STM32学习】——USART串口数据包HEX/文本数据包收发流程串口收发HEX/文本数据包实操

    文章目录 前言 一.数据包格式(江科大规定) 1.HEX数据包 2.文本数据包 3.两者对比 二.数据包收发流程 1.HEX数据包接收(只演示固定包长) 2.文本数据包接收(只演示可变包长) 三.实操 ...

  7. RTP 上封装H264 数据包

    原文链接:https://www.cnblogs.com/Jade2009/p/5654650.html 1.  引言         随着信息产业的发展,人们对信息资源的要求已经逐渐由文字和图片过渡 ...

  8. 路由器是如何实现数据包的传送?—Vecloud微云

    快递在运输的过程中,并不是从起始点直接发往收件人的地址,往往会停留在沿途的快递站点,经过筛选和分装,再分发往下一个目的地.其实在Internet网络中,也有收发数据包的"快递站点" ...

  9. SRTP参数及数据包处理过程

    http://www.rosoo.net/a/201606/17449.html  原链接 目录 1.      相关参数介绍... 1 1.1             SRTP. 1 1.1.1   ...

  10. Windows下底层数据包发送实战

    为什么80%的码农都做不了架构师?>>>    1.简介 所谓"底层数据包"指的是在"运行"于数据链路层的数据包,简单的说就是"以太 ...

最新文章

  1. audio标签的controls属性_HTML5 之视频 video新标签
  2. 怎么看c语言错误出在哪,请各位大佬帮我看看错误出在哪里
  3. 安卓系统辅助功能中的指针停止移动后点击是什么?OTG
  4. Redhat linux下安装oracle11r2手册+截图_toto_V1.0
  5. 白盒测试和黑盒测试_黑盒测试与白盒测试的比较
  6. bzoj3524 [Poi2014]Couriers
  7. 信息学奥赛一本通C++语言——1102: 与指定数字相同的数的个数
  8. 人工智障学习笔记——机器学习(12)LDA降维
  9. python技术文档_Python技术文档最佳实践
  10. layui让文字和div平行_layui富文本的使用注意事项以及拓展
  11. JDK8新特性(十四)之日期时间API
  12. cloc工具 linux,Linux下源代码行数统计工具(sloccount,cloc等)
  13. 「opennurbs」我直接进行一个Opennurbs的手动编译
  14. multicast msdp 1
  15. debian 10 系统运行 uml 与网络配置
  16. 循序渐进Linux目录
  17. pcf8591简明教程 及 51单片机最大只能读到127问题解决
  18. Auto property synthesis will not synthesizeproterty;it will be implemented by its superclass, use@dy
  19. 骑行318、 2016.7.20
  20. C++ 输入输出(cin cout)加速/效率优化

热门文章

  1. Java抽奖概率算法
  2. 归并排序 MergeSort
  3. Matpower使用中问题
  4. c需要简单编程语言,教你C 语言简单编程速成
  5. windows下mysql忘记密码重置
  6. Linux: 多线程
  7. SQL server中表数据自动生成拼音码
  8. COMSOL模拟卡门涡街的模型
  9. 【涡动协方差及能量平衡系统】
  10. 用HTML及CSS制作一个简易动画效果