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,我们大家一块讨论。
版权声明:本文为博主原创文章,转载请声明出处。
- RTSP二次开发包
- rtsp抓包
- RTSP & RTMP 抓包
- QGIS二次开发包下载
- 海康rtsp抓包分析
- 使用批处理打二次开发包
- eclipse导入war包二次开发
- 手机车牌识别二次开发包
- rtsp 网络抓包mplayer+live555
- vlc连接rtsp抓包分析
- Revit 二次开发之安装包的制作
- Qgis二次开发包下载及配置
- rtsp
- RTSP
- RTSP
- RTSP
- rtsp
- rtsp
- Thread类的应用
- oracle 11g角色管理
- Java - 认识 JDBC
- 直接跳转到appStore
- 数据库 关系代数 投影概念理解
- RTSP二次开发包
- django开发要点-URL的配置2,在urlconf中增加参数
- 普通方法验证 邮箱正确性
- mysql支持的数据类型简介
- C++的chrono、ratio和ctime等头文件
- jfinal框架下使用c3P0连接池连接sql server 2008
- Activity之间的跳转(Activity和intent)
- Android开发 NDK编程
- SQL 循环修改数据库编号