您当前的位置: 首页 > 

qianbo_insist

暂无认证

  • 0浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

协议圣经 四 rtspclient

qianbo_insist 发布时间:2021-08-02 21:18:00 ,浏览量:0

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             
关注
打赏
1663161521
查看更多评论
0.1565s