使用p2p发送GB28181流的设计

萌思特

1、p2p链接的必要性

其必要性在于:
1 能够显著减少服务器压力负担
2 随着国内带宽上传能力增加,非对称网络上传视频可能大大提升
3 减少服务费用

2、前提条件

1、由于p2p链接需要很多条件限制,因此并非所有网络方式能够打通p2p方式的链接,我们限制在cone net p2p上进行网关程序间分发。
2、限制udp方式分发流
3、限制联通和电信这类4g网络只能使用turn方式。

3、程序架构

1、udp服务器-主服务器
2、udp服务器-分发中转服务器
3、分发架构路由
4、ps读写构造器客户端进行解包,渲染
5、存储器 —部署在p2p的各端可进行
6、sip gb28181 ----信令服务
7、rtsp proxy
8、webrtc proxy
9、redis 订阅发布
10、tcpserver 可选
流程为:
a)在sip 接收到命令之后,可以invite相应的邀请流进入,这一部分不使用p2p方式,和webrtc本身所使用的方式一致,信令为直接tcp服务或者udp服务的传输,可以使用传统udp服务sip 5060端口。
b) 客户端负责打洞,根据分发配置信令来给服务器来通知,这时stun服务必须由分发内容。
c)打洞完毕(成功),信令服务sdp协议中可以加入接收rtp服务地址
d)传输开始
在这里插入图片描述

3.1层次

层次关系以及所需要的协议等等如下图所示
在这里插入图片描述

3.2程序框架辅助

分发功能
—config 分发配置
—config 路由

sipserver
—gb28181 分发信令服务器
rtp ps 分析器

投屏协议
— DLNA协议

p2p 服务
—传统的stun和turn服务器是可选项
更佳的配置是得到分析,p2p 打洞探测如果为对称立刻进行转发服务。

3.3 程序制作

 给出udpserver的声明,p2p udp server如果使用非异步方式一定要使用多个线程接收,在接收线程中使用recvfrom来得到客户端的外网地址,才能帮助双方打通。
#include "c_decode.h"
#include "c_thread.h"
#include "c_sock.h"
#include <queue>
using namespace std;

typedef struct _RTP_HEAD
{
	unsigned char    version : 2;
	unsigned char    padding : 1;
	unsigned char    extension : 1;
	unsigned char    count : 4;
	unsigned char    marker : 1;
	unsigned char    payload : 7;
	uint16_t            sn;        //16bits 
	uint32_t            ts;        //32 
	uint32_t            ssrc;            //32 
	uint32_t            csrc;            //32 
}RTP_HEAD, *pRTP_HEAD;
typedef struct _RTCP_HEAD
{
	unsigned char    version : 2;
	unsigned char    padding : 1;
	unsigned char    count : 5;
	unsigned char    payload;            //8bits 
	uint16_t         length;           //16bits 
	uint32_t         ssrc; //5,6,7,8 char

}RTCP_HEAD, *pRTCP_HEAD;

//NACK报文是类型为205的RTCP 扩展反馈报文,在RFC4585中定义。

class c_udp:public c_thread
{
private:
   queue<memory_cache*> _memcache;
   
private:
   c_sock _udpserver;
   unsigned int _port;
   H264DecoderContext* _decoder;

public:
	c_udp(void);
	~c_udp(void);
	void Run();

	void StartReceive(unsigned int port,H264DecoderContext *decoder);
	void StopServer();
	memory_cache * GetBufferToDecode();


protected:
	void HandlePacket(char * buffer, int len);
};

给出一个常用的thread class,以上udp 从thread类继承

#include <mutex>
#include <queue>
#include <thread>
#include <atomic>
#include <condition_variable>
using namespace std;

class c_thread
{
private:

	//线程
	thread _thread;
	//等待信号
	std::mutex _signal_mutex;
	std::condition_variable _cond;
protected:
	//char  _running = false;
	char _stop = true;
	//锁定运行状态
	std::mutex _mutex;
public:
	c_thread()
	{}
	virtual ~c_thread()
	{}

public:
	char * status(){
		return &_stop;
	}
	
	void Join()
	{
		if (_thread.joinable())
			_thread.join();
	}
	bool  IsStop()
	{
		return _stop == 1 ? true : false;
	}

	void WaitForSignal()
	{
		std::unique_lock<std::mutex> ul(_signal_mutex);
		_cond.wait(ul);
	}
	void Notify()
	{
		_cond.notify_one();
	}

	virtual int Start()
	{
		if (_stop == 1)//非運行中
		{
			_stop = 0;
			_thread = std::thread(std::bind(&c_thread::Run, this));
			return 0;
		}
		return -1;
	}	
	
	virtual void Stop()
	{
		_stop = 1; // true;
	}

	virtual void Run() = 0;
};
#endif

线程内容就放在run函数中,主线程做收包使用,记录配对的地址和路由,才能做到分发。

其他内容待续。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
国标GB28181是中国监控领域的标准之一,该标准旨在解决公共安全视频监控系统中的数据安全、通信安全和接口标准化等问题。而安卓开源客户端则是针对GB28181标准开发的一款客户端应用,旨在为广大用户提供一种更加方便、便捷的视频监控访问和管理方式。 该开源客户端具有多种功能和特点。首先,该客户端采用了一套独特的底层实现方式,可以实现对多种视频的支持,同时还具有缓存优化机制,使视频播放更加畅。其次,该客户端支持多种设备连接方式,包括P2P连接、IP直连、IP组播等,满足不同用户的需求。此外,该客户端还具有多种播放控制功能,比如倍速播放、捕捉截图、录制视频等,用户可以自由地对可用视频进行编辑和管理。 除此之外,国标GB28181安卓开源客户端还具有高度的可定制性。用户可以根据自身需求进行定制,比如自定义界面、自定义功能等,同时还可以自由进行二次开发。另外,该客户端的代码开源,可以让更多的开发者参与到客户端的开发与完善中来,从而让更多的人受益于该客户端。 总之,国标GB28181安卓开源客户端是一款对广大监控用户极为实用的应用软件。其具有多种功能和特点,让用户更方便地进行视频监控访问和管理。同时,该软件还具有高度的开放性和可定制性,可以让用户根据自身需求进行定制和二次开发。因此,该软件在未来还将会得到更多用户的支持和推崇。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qianbo_insist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值