2015年(2)
分类: C/C++
2015-06-25 11:26:19
本文档主要描述了RtspServer模块的功能说明、使用说明和详细设计。
RTSP为实时媒体流控制协议,该协议在媒体流传输控制领域的运用非常广泛和普及,RtspServer模块的实现,给其它程序使用后,可以满足像VLC等媒体客户端通过RTSP协议访问该程序管理的媒体源。
参考资料 |
《rfc2326 RTSP标准协议》 |
|
术语 |
含义 |
RTSP |
实时流传输协议 |
VLC |
VideoLAN计划的多媒体播放器 |
本次任务主要是设计RtspServer模块,方便其它程序调用,以支持客户端通过RTSP协议访问程序管理的媒体流。
RTSP协议中用URL定位网络资源,对于媒体服务器管理的每路媒体资源都有唯一的URL进行定位,URL格式设计如下:
RTSP_URL = “rtsp” “://” host [“:” port] “/” source
URL中“rtsp”说明RTSP请求使用TCP可靠协议传输。host为媒体服务器IP地址,port为媒体服务器的RTSP服务端口,端口缺省则默认为554,当RTSP服务端口非554时,客户端URL必须包含服务端口。
Source为媒体资源名,媒体资源名由RtspServer使用者自行设计。
指令 |
含义 |
OPTIONS |
获取服务器支持的功能。 |
DESCRIBE |
查询媒体对象。 |
SETUP |
指定流媒体的传输机制。 |
PLAY |
开始发送数据。 |
PAUSE |
暂停发送数据。 |
GET_PARAMETER |
用来测试客户端与服务器的连通情况。 |
SET_PARAMETER |
用来测试用户与服务器的连通情况。 |
TEARDOWN |
释放相关流媒体资源。 |
媒体流传输流程图
如图所示,客户端请求媒体数据时,RTSP CLIENT与RtspServer进行RTSP协议交互,建立媒体传输会话和控制媒体传输。
媒体传输流程具体描述如下:
1) 客户端向服务端发送OPTIONS请求,查询服务端支持RTSP服务的功能;
2) 服务端回应客户端OPTIONS请求,回复服务端支持RTSP服务的功能;
3) 客户端向服务端发送DESCRIBE请求,请求URL指明访问的媒体源,查询媒体源信息;
4) 服务端回调媒体信息查询接口,接口返回媒体视频、音频信息(信息主要说明是否有音频流);
5) 服务端回应客户端DESCRIBE请求,回复包含媒体源描述SDP;
6) 客户端向服务端发送SETUP请求,申请媒体的视频流资源,请求包含客户端视频流接收地址;
7) 服务端回调媒体视频申请接口,接口传入视频流接收地址,返回视频流发送地址;
8) 服务端回应客户端SETUP请求,回复包含视频流收发地址参数;
9) 客户端向服务端发送SETUP请求,申请媒体的音频流资源,请求包含客户端音频流接收地址;
10) 服务端回调媒体音频申请接口,接口传入音频流接收地址,返回音频流发送地址;
11) 服务端回应客户端SETUP请求,回复包含音频流收发地址参数;
12) 客户端向服务端发送PLAY请求,请求开始播放媒体;
13) 服务端回调媒体播放接口,开始播放媒体;
14) 服务端回应客户端PLAY请求,回复包含媒体播放参数;
15) 服务端向客户端发送媒体流,媒体传输使用RTP/RTCP协议;
16) 客户端向服务端发送心跳保活请求,保活请求可以为OPTIONS、SET_PARAMETER和GET_PARAMETER;
17) 服务端对媒体会话心跳保活,每次心跳保活时间为1分钟;
18) 服务端回应客户端心跳保活请求;
19) 客户端向服务端发送TEARDOWM请求,请求释放媒体会话;
20) 服务端回调媒体资源释放接口,释放媒体会话;
21) 服务端回应客户端TEARDOWM请求。
参考live555提供的协议栈进行设计,使用C++语言开发。
方案总体设计图
如图所示,程序SERVER使用RtspServer模块,外部RTSP客户端通过RTSP交互与RTSP SERVER建立媒体传输会话,并通过调用程序SERVER提供的媒体流控制接口,控制媒体流传输。
1) RtspServer
RtspServer类负责启动监听RTSP客户端连接线程和管理RtspReactor对象。RtspServer类管理多个RtspReactor对象,RtspReactor对象个数由客户端连接数确定,当RtspReactor对象添加RtspConnector对象超过64个时会创建新的RtspReactor对象;当RtspReactor对象管理的RtspConnector对象个数为0时,会删除RtspReactor对象。的线程主要负责监听RTSP客户端连接,分配RtspReactor并添加RtspConnector对象,清理空闲的RtspReactor对象。线程执行流程如图。
2) RtspReactor
RtspReactor类负责启动消息收发处理线程和管理RtspConnect对象。一个RtspReactor最多管理64个RtspConnector对象。线程主要负责循环接收客户端RTSP消息,处理消息、发送回应消息给客户端和清理超时的RtspConnector对象。执行流程如图。
3) RtspConnector
RtspConnector类包含媒体会话MediaSession对象、主要负责接收发送RTSP请求和调用MediaSession对象方法处理请求。
1) MediaSession
MediaSession类包含媒体会话参数和会话状态机,主要负责处理RTSP请求,响应请求、控制媒体传输、生成回应消息和会话状态跳转。
2) RtspMediaProvider
RtspMediaProvider类提供媒体传输控制接口。
3) RtspFsm
RtspFsm类负责会话状态跳转。状态机设计如图。
1) RtspPaser
RtspPaser类用于解析RTSP请求消息和生成RTSP回应消息。
1) RtspMediaProvider
RtspMediaProvider为虚类,提供媒体流传输控制接口。
2) RtspMediaProviderFactory
RtspMediaProviderFactory为虚类,提供RtspMediaProvider实例生成接口。