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
#include
#ifdef WIN32
#pragma warning (disable: 4512)
#pragma warning (disable: 4100)
#pragma warning (disable: 4091)
#include
typedef int ssize_t;
#endif
#define RTSP_CALLBACK(uri, resultCode, resultString) \
static void continueAfter ## uri(RTSPClient* rtspClient, int resultCode, char* resultString) { static_cast(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(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)
#endif
class 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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?