从头写rtsp服务器-模块的划分

1. 网络库模块,这个模块主要作用是网络消息通知,还有一个定时器事件,至于网络库怎么写,不会的可以去学习一下网络编程,然后提取出相似的接口。

接口定义如下:

 1 class rtsp:public netoperation,netnocopyable
 2 {
 3 public:
 4     rtsp(){}
 5     rtsp(netaddress & server);
 6
 7     virtual int v_connect(netconnection * n);
 8     virtual int v_close(netconnection * n);
 9     virtual int v_read(netconnection * n);
10     virtual int v_accept(netconnection * n);
11     virtual int v_write(netconnection * n);
12     virtual int v_timer(evtime * e);
13     int v_rtspRead(netconnection * n);
14     int v_rtpRead(netconnection * n);
15 private:
16      netaddress m_serveAddr;
17
18 };

2.rtspconnection类,这里代表一条tcp连接,一个客户端和服务器的一条连接,定义如下:

class RtspClientConnection
{
public:
	RtspClientConnection(netconnection * n,	netaddress & addr);
	virtual ~RtspClientConnection();

	int handle_options(uint seq);

	int handle_describle(
		std::string & streamName,
		uint seq,
		std::string & fullRequestStr);

	const std::string & SessionId(){return m_sessionId;}

	int handle_setup(
		std::string & sessionId,
		std::string & streamName,
		std::string & trackId,
		uint seq,
		std::string & fullRequestStr);

	int handle_incmd(
		std::string & sessionId,
		std::string & cmd,
		std::string & streamName,
		std::string & trackId,
		uint seq,
		std::string & fullRequestStr);

	int handle_play(MediaSession * session,
		MediaSubSession * subSession,
		uint seq,
		std::string & fullRequestStr);

	int handle_pause(MediaSession * session,
		MediaSubSession * subSession,
		uint seq,
		std::string & fullRequestStr);

	int handle_teardown(MediaSession * session,
		MediaSubSession * subSession,
		uint seq,
		std::string & fullRequestStr);

	int handle_getparameter(MediaSession * session,
		MediaSubSession * subSession,
		uint seq,
		std::string & fullRequestStr);

	int handle_setparameter(MediaSession * session,
		MediaSubSession * subSession,
		uint seq,
		std::string & fullRequestStr);

	int handle_register(std::string & urlSuffix,
		std::string & fullRequestStr,
		bool registerRemote);

	void handleCmd_bad(){/*400 Bad Request*/}

	void handleCmd_notSupported(){/*405 Method Not Allowed*/}

	void handleCmd_notFound(){/*404 stream not find*/}

	void handleCmd_sessionNotFound(){/*454 Session Not Found*/}

	void handleCmd_unsupportedTransport(){/*461 Unsupported Transport*/}

protected:
	netaddress m_serveAddr;
	MediaSession * m_mediaSession;
	netconnection * m_n;
	std::string m_sessionId;
};

3. MediaSession类,这里和live555不同的是,这里每一个rtsp请求,都会生产一个MediaSession对象,相当于live555的MediaSession和streamctrl的结合,主要是对submediassion的管理

接口定义如下:

 1 class MediaSession:public netnocopyable
 2 {
 3 public:
 4     MediaSession(const std::string & streamName);
 5
 6     virtual ~MediaSession();
 7
 8     void AddSubSession(MediaSubSession * pMediastream);
 9
10     void DelSubSession(MediaSubSession * pMediastream);
11
12     MediaSubSession* Lookup(std::string & trackId);
13
14     int SubSessionCount();
15
16     MediaSubSession * GetSubSession(int index);
17
18     const std::string & StreamName();
19
20     std::string  GenerateSDPDescription(netaddress & local);
21
22 protected:
23     std::string m_streamName;
24     uint   m_createTime;
25     std::vector <MediaSubSession *> m_vecSubSession;}

4.MediaSubSession类,代表的是一个stream,track,例如一般的MP4文件就有h264 + aac这2个track,接口定义如下

class MediaSubSession: public IRtspStream
{
public:
	MediaSubSession();

	virtual ~MediaSubSession();

	void SetTrackId(uint trackID);

	std::string GetTrackId();

	void SetPayloadType(uint8 number);

	const static std::string & TrackFmt();

	void SetStreamName(const std::string & streamName);

	virtual const std::string & SdpLines();

	//set up
	virtual int GetStreamParam(uint clientRtpPort,
					   uint clientRtcpPort,
					   uint rtpChannelId,
					   uint rtcpChannelId,
					   uint dstIp,
					   uint & dstTTL,
					   bool & isMulticast,
					   uint & serverRtpPort,
					   uint & serverRtcpPort,
					   uint serverIp);

	virtual int StartStream(); //play

	virtual int TransferStream();

	virtual int OnTimer();

	virtual int PauseStream();

	virtual int SeekStream();

	//tear down
	virtual int StopStream();

	virtual uint RtpTimestamp();

	virtual uint SeqNo();

protected:
	std::string m_sdpLines;
	uint m_trackId;
	std::string m_streamName;
	rtp * m_rtp;
	rtcp * m_rtcp;
	uint8 m_payLoadType;
	uint m_baseRtpTimestamp;

	uint m_timestamp;
	uint m_timerId;
	int64 m_nextTimestamp;

	netmutex  m_mutex;
};

5.线程池任务接口:

//用于线程池调用TransferStream接口,进行文件读取,rtp打包,发送 

class IRtspStream:public netnocopyable
{
public:
    virtual int TransferStream() = 0;

    virtual int OnTimer() = 0;
};

今天就更新到这里,下次接着更新

时间: 2024-10-19 23:27:09

从头写rtsp服务器-模块的划分的相关文章

从头写rtsp服务器-RTSP协议的解析

rtps demo(linux是64位的,windows32位的):rtsp_demo.rar 1.首先服务器收到客户端连接请求,生产 一个RtspClientConnection对象,RtspClientConnection定义详见  从头写rtsp服务器-模块的划分 int rtsp::v_accept(netconnection * n) { netoperation::v_accept(n); printf("client accept\n\n\n"); RtspClientC

教你从头写游戏服务器框架

本文由云+社区发表 作者:韩伟 前言 大概已经有差不多一年没写技术文章了,原因是今年投入了一些具体游戏项目的开发.这些新的游戏项目,比较接近独立游戏的开发方式.我觉得公司的"祖传"服务器框架技术不太适合,所以从头写了一个游戏服务器端的框架,以便获得更好的开发效率和灵活性.现在项目将近上线,有时间就想总结一下,这样一个游戏服务器框架的设计和实现过程. 这个框架的基本运行环境是 Linux ,采用 C++ 编写.为了能在各种环境上运行和使用,所以采用了 gcc 4.8 这个"古老

MVVM中写代码的模块区域划分

之前使用MVVM的方式一段时间 + 前天认真的划分设计文档中的模块 = 一种想要强烈的现在使用MVVM的方式 版权声明:本文为博主原创文章,未经博主允许不得转载.

腾讯高级工程师:如何从头开始写游戏服务器框架_转

转自: 腾讯高级工程师:如何从头开始写游戏服务器框架 本文作者:韩伟,腾讯互娱高级工程师,目前在 Next 产品中心研发创新类型游戏. 前言:从去年开始作者投入了一些具体游戏项目的开发,这些新的游戏项目,比较接近独立游戏的开发方式.在这个过程中,作者从头写了一个游戏服务器端的框架,以便获得更好的开发效率和灵活性.因此这篇文章便是该项目服务器框架的设计和实现过程的总结. PS:框架的基本运行环境是 Linux ,采用 C++ 编写.为了能在各种环境上运行和使用,采用了 gcc4.8 这个“古老”的

轻量级RTSP服务模块和RTSP推流模块适用场景区别

好多开发者一直搞不清轻量级RTSP服务SDK和RTSP推流SDK的区别(Github下载地址),以下是相关区别: 1. 轻量级RTSP服务模块:轻量级RTSP服务解决的核心痛点是避免用户或者开发者单独部署RTSP或者RTMP服务,实现本地的音视频数据(如摄像头.麦克风),编码后,汇聚到内置RTSP服务,对外提供可供拉流的RTSP URL,轻量级RTSP服务,适用于内网环境下,对并发要求不高的场景,支持H.264/H.265,支持RTSP鉴权.单播.组播模式,考虑到单个服务承载能力,我们支持同时创

PC端VLC搭建RTSP服务器,Android端链接不上

用VLC建了一个流媒体服务器,在本机端打开网络串流并没有任何问题,当时在android端链接是在Option时失败,connection time out,另外在搭建VLC RTSP服务器并没有任何问题,在别的机器上同样的搭建方法却可以正常播放,这说明还是本机的配置哪里出现的故障? 解决方法: 在PC机上对防火墙进行高级设置,具体步骤如下: 控制面板 -> 系统和安全 -> Windows防火墙中 左侧点击 高级设置 点击左侧 ->入站规则,然后点击右侧->新建规则,然后在弹出的入

raspberrypi 摄像头 rtsp服务器

1.获取树莓派的摄像头的视频源并且输出到 gstreamer中,并将数据传输到tcpserversink中,设定端口为5000 raspivid -t 0 -w 800 -h 600 -fps 25 -g 5 -b 4000000 -vf -n -o - | gst-launch-1.0 fdsrc ! h264parse ! gdppay ! tcpserversink host=127.0.0.1 port=5000 2.在gst-rtsp-server的example中test-launc

Tornado写简易服务器

我们都知道在Web开发中,都需要服务器,比如Java Web开发的Tomcat,WebLogic,WebSphere,现在来看利 用Tornado Web Server框架如何写一个简易的Python服务器. 一般来说只需要实现get和post方法就可以了.以上次使用redis数据库的例子说明,数据库插入代码如下: import redis import datetime class Database: def __init__(self): self.host = 'localhost' se

四、VLC搭建rtsp服务器

一.VLC搭建rtsp服务器 1.rtsp服务搭建 2.播放 rtsp地址:rtsp://localhost:8554/hello 原文地址:https://www.cnblogs.com/fger/p/11517544.html