首页 > 代码库 > 从头写rtsp服务器-模块的划分

从头写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;};

 

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

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