jrtplib使用笔记
一、简述
RTP 是目前解决流媒体实时传输问题的最好办法,而JRTPLIB 是一个用C++语言实现的RTP库,包括UDP通讯。刚使用JRTPLIB,对JRTPLIB的理解还不够深,当做使用时,积累的一些经验写个笔记吧。
二、RTP协议
实时传送协议(Real-time Transport Protocol或简写RTP,也可以写成RTTP)是一个网络传输协议,RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。它一开始被设计为一个多播协议,但后来被用在很多单播应用中。RTP协议常用于流媒体系统(配合RTCP协议或者RTSP协议)。因为RTP自身具有Time stamp所以在ffmpeg 中被用做一种formate。
RTP协议的详细介绍,请参考这篇文章http://www.360doc.com/content/11/1009/15/496343_154624612.shtml
三、RTPSession类
这里不介绍jrtplib的编译安装,这个很简单,网上很多地方都有讲解。
jrtplib的使用中,主要是围绕这个类来实现的,因此大家有必要去查看源码,看这类的实现。为了方便使用,我在这做了RTPSession的继承封装,下面直接贴代码了。
RTPSessionUtils.h
- #include "rtpsession.h"
- #include "rtppacket.h"
- #include "rtpudpv4transmitter.h"
- #include "rtpipv4address.h"
- #include "rtpsessionparams.h"
- #include "rtperrors.h"
- #ifndef WIN32
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #else
- #include <winsock2.h>
- #endif // WIN32
- #include "rtpsourcedata.h"
- #include <stdlib.h>
- #include <stdio.h>
- #include <iostream>
- #include <string>
- //jrtplib应用需链接的lib
- #pragma comment(lib,"ws2_32.lib")
- #pragma comment(lib, "jrtplib_d.lib")
- #pragma comment(lib,"jthread_d.lib")
- namespace jrtplib
- {
- class RTPSessionUtils : public RTPSession
- {
- typedef RTPSession base_type;
- public:
- RTPSessionUtils();
- ~RTPSessionUtils();
- int AddDestination(const std::string& ip, uint16_t port);
- int DeleteDestination(const std::string& ip, uint16_t port);
- int CreateDefault(uint16_t port);
- protected:
- void OnNewSource(RTPSourceData *dat);
- void OnBYEPacket(RTPSourceData *dat);
- void OnRemoveSource(RTPSourceData *dat);
- void OnRTPPacket(RTPPacket *pack,const RTPTime &receivetime,
- const RTPAddress *senderaddress);
- void OnRTCPCompoundPacket(RTCPCompoundPacket *pack,const RTPTime &receivetime,
- const RTPAddress *senderaddress);
- void OnPollThreadStep();
- private:
- int GetAddrFromSource(RTPSourceData *dat, uint32_t& ip, uint16_t& port);
- };
- }
- //整形的ip转成字符串ip
- static std::string IPToString(const unsigned int iIP)
- {
- struct in_addr inaddr;
- inaddr.s_addr = htonl(iIP);
- return std::string(inet_ntoa(inaddr));
- }
- //字符串ip转成整形ip
- static unsigned int IPToInt(const std::string& sIP)
- {
- return inet_addr(sIP.c_str());
- }
RTPSessionUtils.cpp
- #include "RTPSessionUtils.h"
- namespace jrtplib{
- RTPSessionUtils::RTPSessionUtils()
- {
- #ifdef WIN32
- WSADATA dat;
- WSAStartup(MAKEWORD(2,2),&dat);
- #endif // WIN32
- }
- RTPSessionUtils::~RTPSessionUtils()
- {
- #ifdef WIN32
- WSACleanup();
- #endif // WIN32
- }
- int RTPSessionUtils::CreateDefault(uint16_t port)
- {
- RTPUDPv4TransmissionParams transparams;
- RTPSessionParams sessparams;
- sessparams.SetOwnTimestampUnit(1.0/10.0);//必须设置
- transparams.SetPortbase(port);//port必须是偶数
- return base_type::Create(sessparams, &transparams);
- base_type::SetDefaultPayloadType(0);
- base_type::SetDefaultTimestampIncrement(0);
- base_type::SetDefaultMark(false);
- }
- int RTPSessionUtils::AddDestination(const std::string& ip, uint16_t port)
- {
- return base_type::AddDestination(RTPIPv4Address(ntohl(inet_addr(ip.c_str())), port));
- }
- int RTPSessionUtils::DeleteDestination(const std::string& ip, uint16_t port)
- {
- return base_type::DeleteDestination(RTPIPv4Address(ntohl(inet_addr(ip.c_str())), port));
- }
- int RTPSessionUtils::GetAddrFromSource(RTPSourceData *dat, uint32_t& ip, uint16_t& port)
- {
- if (dat->IsOwnSSRC())
- return -1;
- if (dat->GetRTPDataAddress() != 0)
- {
- const RTPIPv4Address *addr = (const RTPIPv4Address *)(dat->GetRTPDataAddress());
- ip = addr->GetIP();
- port = addr->GetPort();
- }
- else if (dat->GetRTCPDataAddress() != 0)
- {
- const RTPIPv4Address *addr = (const RTPIPv4Address *)(dat->GetRTCPDataAddress());
- ip = addr->GetIP();
- port = addr->GetPort()-1;
- }
- return 0;
- }
- void RTPSessionUtils::OnNewSource(RTPSourceData *dat)
- {
- uint32_t ip;
- uint16_t port;
- if (GetAddrFromSource(dat, ip, port))
- return;
- RTPIPv4Address dest(ip,port);
- base_type::AddDestination(dest);
- std::cout << "OnNewSource Adding destination " << IPToString(ip) << ":" << port << std::endl;
- }
- void RTPSessionUtils::OnRemoveSource(RTPSourceData *dat)
- {
- if (dat->ReceivedBYE())
- return;
- uint32_t ip;
- uint16_t port;
- if (GetAddrFromSource(dat, ip, port))
- return;
- RTPIPv4Address dest(ip,port);
- base_type::DeleteDestination(dest);
- std::cout << "OnRemoveSource Deleting destination " << IPToString(ip) << ":" << port << std::endl;
- }
- void RTPSessionUtils::OnBYEPacket(RTPSourceData *dat)
- {
- uint32_t ip;
- uint16_t port;
- if (GetAddrFromSource(dat, ip, port))
- return;
- RTPIPv4Address dest(ip,port);
- base_type::DeleteDestination(dest);
- std::cout << "OnBYEPacket Deleting destination " << IPToString(ip) << ":" << port << std::endl;
- }
- //只要有rtp包就会触发
- void RTPSessionUtils::OnRTPPacket(RTPPacket *pack,const RTPTime &receivetime,
- const RTPAddress *senderaddress)
- {
- std::cout << "OnRTPPacket: data:" << pack->GetPayloadData() << std::endl;
- }
- //收到rtcp包触发
- void RTPSessionUtils::OnRTCPCompoundPacket(RTCPCompoundPacket *pack,const RTPTime &receivetime,
- const RTPAddress *senderaddress)
- {
- std::cout << "OnRTCPCompoundPacket: data:" << pack->GetCompoundPacketData() << std::endl;
- }
- //隔段时间就会触发,也可以用于收包回调函数
- //void RTPSessionUtils::OnPollThreadStep()
- //{
- // BeginDataAccess();
- // // check incoming packets
- // if (GotoFirstSourceWithData())
- // {
- // do
- // {
- // RTPPacket *pack;
- // RTPSourceData *srcdat;
- // srcdat = GetCurrentSourceInfo();
- // while ((pack = GetNextPacket()) != NULL)
- // {
- // std::cout << "Got packet " << pack->GetExtendedSequenceNumber() << " from SSRC " << srcdat->GetSSRC() << std::endl;
- // DeletePacket(pack);
- // }
- // } while (GotoNextSourceWithData());
- // }
- // EndDataAccess();
- //}
- }
server.cpp
- #include <iostream>
- #include "RTPSessionUtils.h"
- using namespace jrtplib;
- void main()
- {
- int status;
- RTPSessionUtils sess;
- status = sess.CreateDefault(8888);
- if(status)
- {
- std::cout << "RTP error:" << RTPGetErrorString(status) << std::endl;
- return;
- }
- while (1)
- {
- std::string buf;
- std::cout << "Input send data:" ;
- std::cin >> buf;
- sess.SendPacket((void*)buf.c_str(), buf.length(), 0, false, 0);
- if(status)
- {
- std::cout << "RTP error:" << RTPGetErrorString(status) << std::endl;
- continue;
- }
- }
- system("pause");
- }
client.cpp
- #include <iostream>
- #include "RTPSessionUtils.h"
- using namespace jrtplib;
- void main()
- {
- int status;
- RTPSessionUtils sess;
- status = sess.CreateDefault(6666);
- if(status)
- {
- std::cout << "RTP error:" << RTPGetErrorString(status) << std::endl;
- return;
- }
- status = sess.AddDestination("127.0.0.1", 8888);
- if(status)
- {
- std::cout << "RTP error:" << RTPGetErrorString(status) << std::endl;
- return;
- }
- while (1)
- {
- std::string buf;
- std::cout << "Input send data:" ;
- std::cin >> buf;
- sess.SendPacket((void*)buf.c_str(), buf.length(), 0, false, 0);
- if(status)
- {
- std::cout << "RTP error:" << RTPGetErrorString(status) << std::endl;
- continue;
- }
- }
- system("pause");
- }
jrtplib使用笔记相关推荐
- JRtplib开发笔记(二):JRtplib库编译、示例演示
原博主博客地址:https://blog.csdn.net/qq21497936 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/84 ...
- JRtplib开发笔记(四):JRtplib的VS开发环境搭建以及Demo
原博主博客地址:https://blog.csdn.net/qq21497936 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/84 ...
- jrtplib学习笔记1
1.下载jrtplib 3.5.2,要注意有时下载后,其中有些头文件是空的,如果这样的话,可以用相近版本的头文件来代替,或者到其它地方重新下载 2.编译jthread工程,并生成jthread.lib ...
- jrtplib使用注意事项
一.说明 RTP 现在的问题是要解决的流媒体的实时传输的问题的最佳方法.和JRTPLIB 是一个用C++语言实现的RTP库.包含UDP通讯.刚使用JRTPLIB,对JRTPLIB的理解还不够深,当做使 ...
- H264和H265的学习笔记
H264和H265的学习笔记记录分享 一.H264的组成: 二.H265的组成: 三.H264和H265由es打包为pes再打包为ps的代码思路如下: 四.补充说明 一.H264的组成: 1.H264 ...
- 【读书笔记】知易行难,多实践
前言: 其实,我不喜欢看书,只是喜欢找答案,想通过专业的解答来解决我生活的困惑.所以,我听了很多书,也看了很多书,但看完书,没有很多的实践,导致我并不很深入在很多时候. 分享读书笔记: <高效1 ...
- 【运维学习笔记】生命不息,搞事开始。。。
001生命不息,搞事不止!!! 这段时间和hexesdesu搞了很多事情! 之前是机械硬盘和固态硬盘的测速,我就在那默默的看着他一个硬盘一个机械测来测去. 坐在他后面,每天都能看到这位萌萌的小男孩,各 ...
- SSAN 关系抽取 论文笔记
20210621 https://zhuanlan.zhihu.com/p/353183322 [KG笔记]八.文档级(Document Level)关系抽取任务 共指id嵌入一样 但是实体嵌入的时候 ...
- pandas以前笔记
# -*- coding: utf-8 -*- """ Created on Sat Jul 21 20:06:20 2018@author: heimi "& ...
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
最新文章
- TF-IDF 原理及sklearn中的tf-idf实例分析
- 激光雷达 win10
- python有趣代码-一个有意思的 Python 训练项目集
- Objective-C Runtime
- 微信自动回复和自动抢红包实现原理(二):自动回复
- Eclipse新建web项目出现The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path
- 如何学习机器学习、看待算法竞赛?粉丝精选留言
- c语言下列循环的循环次数,在C语言中,若i=3,则语句 while (i) { i--; break;}的循环次数为 答案:1...
- linux怎样禁止他人远程,linux禁止用户远程登录的方法
- JSP→JavaWeb简介、Tomcat服务器安装启动测试目录、Tomcat手动创建项目、开发工具MyEclipse与Eclipse配置环境、MyEclipse创建Web程序目录、修改Tomcat端口
- 区块链100讲:详解Po.et 技术栈
- 【目标跟踪】基于matlab红外图像弱小目标检测与跟踪【含Matlab源码 374期】
- SpringCloud Netflix—微服务架构
- 2008 r2 server sql 中文版补丁_Microsoft SQL Server 2008 r2 sp2补丁 64位 官方免费版
- Hive集成Tez让大象飞起来
- mysql入门_高洛峰_简介_linux安装_远程连接配置_sql语句初始
- FFmpeg创作GIF表情包教程来了!赶紧说声多谢乌蝇哥?
- php 截取取最后一个字符
- A hybrid method of exponential smoothing and recurrent
- nav 计算机网络_计算机网络课件谢希仁