RTSP二次开发包

来源:互联网 发布:stoll制版程序员招 编辑:程序博客网 时间:2024/05/16 23:02

RTSP二次开发包

概述

RTSP开源代码属Live555最为权威完整,其单线程、socket控制、任务调度等思想值得我们借鉴。单线程消除了所有互斥量,极大提高了程序的运行效率。Socket控制让一个socket对应一个回调函数,高效完成多客户端的处理。任务调度是该开源的经典,单线程的基本实现就是依赖于任务调度,这对于我们以后研究消息机制会有很大的帮助。
Live555强大的设计框架如果能够被吸收,并且结合其他思想,我想就能设计出一个更为强大的、扩展性更好的RTSP服务器。本二次开发包就结合了Live555的基本思想,吸收MFC消息机制,数据源模块独立为一个动态库而设计的。

Live555单线程原理请参考:
http://blog.csdn.net/wjh_monkey/article/details/42024427
模仿MFC消息机制请参考:
http://blog.csdn.net/wjh_monkey/article/details/22899459

基本框架

类关系图如下:
这里写图片描述

类说明如下:
 RtspClient:用于接收socket的数据,在socket控制中一个socket
对应一个RtspClient。接收命令之后需要交给RtspBase进行参 数解析。
 RtspBase:参数解析,具体命令的执行。RTSP中的OPTIONS等
命令都有该类的Handle方法执行。
 Session:实际会话的内容,类似于Http中的session,该Session可
以不随RtspBase的释放而释放,下次连接时可以通过sessionId找回。
 MediaSession:媒体会话,用于管理其子会话,一个RTSP连接可
能打开多个数据源。
 SubSession:具体的一个子会话,管理目标、消费和数据源。

关闭连接的方法有三种情况:
1. 失去连接,RtspClient中关闭连接,该情况不释放session。
2. 执行teardown命令,释放session并调用RtspClient中的关闭方法。
3. 没有数据源,调用RtspBase的关闭方法。

命令扩展

根据RTSP的协议,头域的开始为命令标识。命令的派发在RtspClient中,具体如下:
//消息映射表
BEGIN_MFH_MESSAGE_MAP(RtspClient,MfhHttpClient)
MFH_COMMAND(“OPTIONS”,&RtspClient::OnOptions)
MFH_COMMAND(“DESCRIBE”,&RtspClient::OnDescribe)
MFH_COMMAND(“SETUP”,&RtspClient::OnSetup)
MFH_COMMAND(“PLAY”,&RtspClient::OnPlay)
MFH_COMMAND(“TEARDOWN”,&RtspClient::OnTearDown)
END_MFH_MESSAGE_MAP()
如果需要扩展自己的命令只需要在开始于结束宏之间增加MFH_COMMAND即可。
命令扩展之后可以自己解析参数,也可以通过RTSPBase解析参数,如果通过RtspBase解析则需要显示调用具体如下:
//解析命令
m_rtspBase->ExecuteParse((char*)cmd);

    m_rtspBase->HandleOptions();

(这边举例Options命令)
如果需要扩展自己的参数,可以在RtspBase的派生类中增加或覆盖具体的参数。BEGIN_MFH_MESSAGE_MAP(RtspClient,MfhHttpClient)就是派生于MfhHttpClient,然后新增自己的命令的。
//消息映射表
BEGIN_MFH_MESSAGE_MAP(CRtspBase,MfhMsgBase)
MFH_COMMAND(“CSeq:”,&CRtspBase::OnCSeq)
MFH_COMMAND(“Accept:”,&CRtspBase::OnAccept)
MFH_COMMAND(“Transport:”,&CRtspBase::OnTransport)
MFH_COMMAND(“Range:”,&CRtspBase::OnRange)
MFH_COMMAND(“Session:”,&CRtspBase::OnSession)
MFH_COMMAND(“Scale:”,&CRtspBase::OnScale)
END_MFH_MESSAGE_MAP()
这些命令的解析结果会存放到成员变量中。

实现自己的H264数据流

数据流的实现在独立的动态库中,所以首先需要创建一个动态库工程。
只需要实现如下类:
class FileH264EsSource : public H264Fragmenter
在该类中实现的方法有:
/**
* 读取数据
*@to 保存数据的缓冲区
*@maxSize 缓冲区最大容量
*@frameSize 得到的数据大小
*@durationInMicroseconds 当前读取的帧持续多长时间,单位毫秒
*@return 需要关闭当前流则返回FALSE
* 不要关闭则返回TRUE
*/
BOOL FileH264EsSource::DoGetNextFrame(BYTE* to
,DWORD maxSize
,DWORD &frameSize
,DWORD &durationInMicroseconds);

对于live555有什么其他疑问,请发邮件到wjh_2010@163.com,我们大家一块讨论。

版权声明:本文为博主原创文章,转载请声明出处。

1 0
原创粉丝点击