live555 rtsp client

为了让读者快速掌握或者说快速做出一个rtspclient ,我们使用live555 来做一个客户端,live555是一个比较出名的rtsp协议实现库,虽然说他代码c++中继承较多,但不失为一个比较认真和全面的库。

rtsp client 注意点

1 、要做一个rtsp客户端,必须实现rtp协议,rtcp协议和rtsp协议
2、 rtcp可以用来保活和统计
3、可以使用 rtp over tcp 和 rtp over udp
4、在局域网里面,可以使用udp 甚至 multicast 组播,外网,请使用tcp

show me the code

这里提供一个rtsp client ,非常简便,一个头文件搞定。


/* ---------------------------------------------------------------------------
**
2021-02-13
email 418511899@qq.com
**
** -------------------------------------------------------------------------*/#pragma once#include "BasicUsageEnvironment.hh"
#include "liveMedia.hh"
#include <string>
#include <iostream>
#ifdef WIN32
#pragma warning (disable: 4512)
#pragma warning (disable: 4100)
#pragma warning (disable: 4091)
#include <stdint.h>
typedef int ssize_t;
#endif#define RTSP_CALLBACK(uri, resultCode, resultString) \
static void continueAfter ## uri(RTSPClient* rtspClient, int resultCode, char* resultString) { static_cast<c_rtsp::RTSPClientConnection*>(rtspClient)->continueAfter ## uri(resultCode, resultString); } \
void continueAfter ## uri (int resultCode, char* resultString); \
/**/#define TASK_CALLBACK(class,task) \
TaskToken m_ ## task ## Task; \
static void Task ## task(void* rtspClient) { static_cast<class*>(rtspClient)->Task ## task(); } \
void Task ## task (); \
/**/#if LIVEMEDIA_LIBRARY_VERSION_INT > 1371168000 #define RTSPClientConstrutor(env, url, verbosity, appname, httpTunnelPort) RTSPClient(env, url, verbosity, appname, httpTunnelPort ,-1)
#else                   #define RTSPClientConstrutor(env, url, verbosity, appname, httpTunnelPort) RTSPClient(env, url, verbosity, appname, httpTunnelPort)
#endifclass Environment : public BasicUsageEnvironment
{public:Environment(char * stop) : BasicUsageEnvironment(*BasicTaskScheduler::createNew()), m_stop(stop){m_stop = stop;}~Environment(){TaskScheduler* scheduler = &this->taskScheduler();delete scheduler;}void mainloop(){this->taskScheduler().doEventLoop(m_stop);}void stop(){*m_stop = 1;}protected:char* m_stop;
};typedef void (*callback_onData)(void * puser, uint8_t*, ssize_t len);class c_rtsp
{public:class Callback{public:virtual bool    onNewSession(const char* id, const char* media, const char* codec, const char* sdp) { return true; }virtual bool    onData(const char* id, unsigned char* buffer,ssize_t size, struct timeval presentationTime){if (v_callback != NULL) {//回调函数,传回名称和数据,数据大小+头部的大小v_callback(v_user, buffer, size);return true;}return false;}virtual ssize_t onNewBuffer(unsigned char* buffer, ssize_t size) {return 0; }virtual void    onError(c_rtsp&, const char*message)  {std::cout << v_name << ":Error:" << message << std::endl;}virtual void    onConnectionTimeout(c_rtsp& connection){std::cout << v_name << ":Connection timeout -> retry" << std::endl;connection.start();}virtual void    onDataTimeout(c_rtsp& connection){std::cout << v_name << ":Data timeout -> retry" << std::endl;connection.start();}//增加的头部长度int v_header = 0;std::string v_name= "empty" ;void RegisterCallBack(void * puser, int headlen, callback_onData cb) {v_user = puser;v_header = headlen;v_callback = cb;}callback_onData v_callback = NULL;void * v_user = NULL;};protected:class SessionSink: public MediaSink {public:static SessionSink* createNew(UsageEnvironment& env, Callback* callback) { return new SessionSink(env, callback); }private:SessionSink(UsageEnvironment& env, Callback* callback);virtual ~SessionSink();void allocate(ssize_t bufferSize);static void afterGettingFrame(void* clientData, unsigned frameSize,unsigned numTruncatedBytes,struct timeval presentationTime,unsigned durationInMicroseconds){static_cast<SessionSink*>(clientData)->afterGettingFrame(frameSize, numTruncatedBytes, presentationTime, durationInMicroseconds);}void afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime, unsigned durationInMicroseconds);virtual Boolean continuePlaying();private:u_int8_t*              m_buffer;ssize_t                 m_bufferSize;Callback*              m_callback;     };class RTSPClientConnection : public RTSPClient{public:RTSPClientConnection(c_rtsp& connection, Environment& env, Callback* callback, const char* rtspURL, int timeout, bool rtpovertcp, int verbosityLevel);virtual ~RTSPClientConnection(); protected:void sendNextCommand(); RTSP_CALLBACK(DESCRIBE,resultCode,resultString);RTSP_CALLBACK(SETUP,resultCode,resultString);RTSP_CALLBACK(PLAY,resultCode,resultString);TASK_CALLBACK(c_rtsp::RTSPClientConnection,ConnectionTimeout);TASK_CALLBACK(c_rtsp::RTSPClientConnection,DataArrivalTimeout);protected:c_rtsp&          m_connection;int                      m_timeout;bool                     m_rtpovertcp;MediaSession*            m_session;                   MediaSubsession*         m_subSession;             MediaSubsessionIterator* m_subSessionIter;Callback               * m_callback;     unsigned int             m_nbPacket;};public:c_rtsp(const char* rtspURL,int header = 4,int timeout = 5, bool rtpovertcp = false, int verbosityLevel = 0);virtual ~c_rtsp();void Register_Callcack(void * puser,const char * name, int headlen, callback_onData cb){if (name != NULL)m_callback.v_name = name;elsem_callback.v_name = "empty";m_callback.RegisterCallBack(puser, headlen, cb);}void start(unsigned int delay = 0);void stop();protected:TASK_CALLBACK(c_rtsp,startCallback);protected:Environment              m_env;Callback                 m_callback;  std::string              m_url;int                      m_timeout = 2;bool                     m_rtpovertcp = false;int                      m_verbosity = 0;RTSPClientConnection*    m_rtspClient;
};

调用

请听下回分解

协议圣经 四 rtspclient相关推荐

  1. 协议圣经(二) RTP组播音视频技巧

    协议圣经 协议圣经一是基础,还没有写,先出2 RTP组播 RTP为半应用层,半传输层协议,可以使用tcp,也可以使用udp,组播为D类地址,为何要使用组播,组播对什么有效,如224.3.4.5,端口选 ...

  2. 网络协议(十四):WebSocket、WebService、RESTful、IPv6、网络爬虫、HTTP缓存

    网络协议系列文章 网络协议(一):基本概念.计算机之间的连接方式 网络协议(二):MAC地址.IP地址.子网掩码.子网和超网 网络协议(三):路由器原理及数据包传输过程 网络协议(四):网络分类.IS ...

  3. 移动设备管理(MDM)与OMA OTA DM协议向导(四)——GSM 系统

    移动设备管理(MDM)与OMA OTA DM协议向导(四)--GSM 系统 1. 第一代模拟蜂窝系统(1G) 1971年12月,贝尔(Bell)公司向美国联邦通信委员会(FCC)提交了蜂窝移动 通信系 ...

  4. 图解ARP协议(四)代理ARP:善意的欺骗

    首发于 跟杰哥学网络与安全 写文章 登录 图解ARP协议(四)代理ARP:善意的欺骗 拼客学院陈鑫杰 24 天前 一.代理ARP概述 我:当电脑要访问互联网上的服务器,目标MAC是什么? 很多小伙伴在 ...

  5. 三菱FX3G/FX3S 485协议通讯四台三菱E700变频器

    三菱FX3G/FX3S 485协议通讯四台三菱E700变频器程序资料 三菱FX3G/FX3S+485bd扩展,采用modbus rtu协议,crc校验,通讯控制四台E700变频器,可以实现正反转,停止 ...

  6. 图解ARP协议(四)代理ARP原理与实践(“善意的欺骗”)

    一.代理ARP概述 我:当电脑要访问互联网上的服务器,目标MAC是什么? 很多小伙伴在刚学习网络协议的时候,经常这样直接回应:不就是服务器的MAC嘛! 这时我会反问:那电脑怎么拿到这个服务器的MAC地 ...

  7. 【译】WebSocket协议第四章——连接握手(Opening Handshake)

    概述 本文为WebSocket协议的第四章,本文翻译的主要内容为WebSocket建立连接开始握手的内容,主要包含了客户端和服务端握手的内容,以及双方如何处理相关字段和逻辑. 4 开始握手(协议正文) ...

  8. TDengine:无模式写入行协议的四种方式

    小 T 导读:为了在数据采集项频繁变动的情况下保证用户仍然能够顺利地完成数据记录工作,TDengine 提供了三种无模式写入协议,分别是 InfluxDB Line 协议.OpenTSDB Telne ...

  9. 网络协议实验四 ARP 协议分析实验

    实验四 ARP 协议分析实验 2.2 ARP 协议分析实验 1.ARP 协议介绍 ARP 是地址解析协议 (Reverse Address Resolution Protocol)的缩写,负责实现从I ...

最新文章

  1. c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...
  2. CSS background 之设置图片为背景技巧
  3. 几行代码轻松实现,Tensorlayer 2.0推出深度强化学习基准库
  4. 快速上手的Glide4.x教程
  5. php mysql 超时时间_php mysql超时设置方法
  6. C++ 十字链表图转java版
  7. 了解单片机及单片机的控制原理和 DX516 的用法,控制一个 LED 灯的亮
  8. 浅析webrtc中音频的录制和播放流程
  9. 高中计算机结业考试总结,高中考试总结
  10. 【重识 HTML + CSS】列表、表格、表单
  11. c# winform 设置winform进入窗口后在文本框里的默认焦点
  12. 经常使用Code 39条形码,你了解它吗? 今天就来看看什么是Code 39
  13. STM32F103C8T6最小系统
  14. 不小心把移动硬盘设置为活动分区后的解决方法
  15. 英語專家談英語學習認識方法
  16. 用程序 揭秘 用手机号尾号暴露你年龄的 骗局
  17. springboot供应商管理系统毕业设计源码121518
  18. 垃圾收集器G1与ZGC
  19. oracle 启动与停止工作,win7出现已停止工作如ie已停止工作、word停止工作等等
  20. c++植树问题解决代码

热门文章

  1. html+css+js实现关键词随机图片
  2. 华为捐赠欧拉 共建数字基础设施开源操作系统
  3. 京泉华:与小米生态链公司已在智能家居领域等展开相关业务合作
  4. 苹果今年将为iPhone采购1.72亿块OLED屏幕 六成用于iPhone 13
  5. 吉利汽车终止科创板IPO
  6. 阿里影业授出1672.5万份购股权
  7. 年初至今主动权益基金平均亏损2.96%
  8. 黄峥辞任董事长,超级投票权失效!拼多多已成为中国电商第一
  9. 特斯拉:国内超级充电桩已超6000个
  10. 拉勾发布互联网人薪资报告 2021开年薪资环比增长7%