RTSP 服务器实例 live555 源代码

1. RTSP 连接的建立过程

RTSPServer 类用于构建一个 RTSP 服务器,该类同时在其内部定义了一个 RTSPClientSession 类,用于处理单独的客户会话。

首先创建 RTSP 服务器 (具体实现类是 DynamicRTSPServer),在创建过程中,先建立 Socket (ourSocket) 在 TCP 的 554 端口进行监听,然后把连接处理函数句柄 (RTSPServer::incomingConnectionHandler) 和 socket 句柄传给任务调度器 (taskScheduler)。

任务调度器把 socket 句柄放入后面 select 调用中用到的 socket 句柄集 (fReadSet) 中,同时将 socket 句柄和 incomingConnectionHandler 句柄关联起来。接着,主程序开始进入任务调度器的主循环(doEventLoop),在主循环中调用系统函数 select 阻塞,等待网络连接。

当 RTSP 客户端输入 连接服务器时,select 返回对应的 socket,进而根据前面保存的对应关系,可找到对应处理函数句柄,这里就是前面提到的 incomingConnectionHandler 了。在 incomingConnectionHandler 中创建了 RTSPClientSession,开始对这个客户端的会话进行处理。
2. DESCRIBE 请求消息处理过程

RTSP 服务器收到客户端的 DESCRIBE 请求后,根据请求 URL ,找到对应的流媒体资源,返回响应消息。live555 中的 ServerMediaSession 类用来处理会话中描述,它包含多个(音频或视频)的子会话描述 (ServerMediaSubsession)。

RTSP 服务器收到客户端的连接请求,建立了 RTSPClientSession 类,处理单独的客户会话。在建立 RTSPClientSession 的过程中,将新建立的 socket 句柄(clientSocket)和 RTSP 请求处理函数句柄 RTSPClientSession::incomingRequestHandler 传给任务调度器,由任务调度器对两者进行一对一关联。

当客户端发出 RTSP 请求后,服务器主循环中的 select 调用返回,根据 socket 句柄找到对应的 incomingRequestHandler,开始消息处理。先进行消息的解析,如果发现请求是 DESCRIBE 则进入 handleCmd_DESCRIBE 函数。根据客户端请求 URL 的后缀 (如 1.mpg), 调用成员函数 DynamicRTSPServer::lookupServerMediaSession 查找对应的流媒体信息 ServerMediaSession。如果 ServerMediaSession 不存在,但是本地存在 1.mpg 文件,则创建一个新的 ServerMediaSession。在创建 ServerMediaSession 过程中,根据文件后缀.mpg,创建媒体 MPEG-1or2 的解复用器 (MPEG1or2FileServerDemux)。再由 MPEG1or2FileServerDemux 创建一个子会话描述 MPEG1or2DemuxedServerMediaSubsession。最后由 ServerMediaSession 完成组装响应消息中的 SDP 信息(SDP 组装过程见下面的描述),然后将响应消息发给客户端,完成一次消息交互。

SDP 消息组装过程:

      ServerMediaSession 负责产生会话公共描述信息,子会话描述由 MPEG1or2DemuxedServerMediaSubsession 产生。 MPEG1or2DemuxedServerMediaSubsession 在其父类成员函数 OnDemandServerMediaSubsession::sdpLines () 中生成会话描述信息。在 sdpLines () 实现里面,创建一个虚构 (dummy) 的 FramedSource (具体实现类为 MPEG1or2AudioStreamFramer 和 MPEG1or2VideoStreamFramer) 和 RTPSink(具体实现类为 MPEG1or2AudioRTPSink 和 MPEG1or2VideoRTPSink),最后调用 setSDPLinesFromRTPSink (...) 成员函数生成子会话描述。

Live555 库是一个使用开放标准协议如 RTP/RTCP、RTSP、SIP 等实现多媒体流式传输的开源 C 库集。这些函数库可以在 Unix、Windows、QNX 等操作系统下编译使用,基于此建立 RTSP/SIP 服务器和客户端来实现多媒体流的传输。下面给出具体实现过程 [4]:

(1)客户端发起 RTSP OPTION 请求,目的是得到服务器提供什么方法。RTSP 提供的方法一般包括 OPTIONS、DESCRIBE、SETUP、TEARDOWN、PLAY、PAUSE、SCALE、GET_PARAMETER。

(2)服务器对 RTSP OPTION 回应,服务器实现什么方法就回应哪些方法。在此系统中,我们只对 DESCRIBE、SETUP、TEARDOWN、PLAY、PAUSE 方法做了实现。

(3)客户端发起 RTSP DESCRIBE 请求,服务器收到的信息主要有媒体的名字,解码类型,视频分辨率等描述,目的是为了从服务器那里得到会话描述信息(SDP)。

(4)服务器对 RTSP DESCRIBE 响应,发送必要的媒体参数,在传输 H.264 文件时,主要包括 SPS/PPS、媒体名、传输协议等信息。

(5)客户端发起 RTSP SETUP 请求,目的是请求会话建立并准备传输。请求信息主要包括传输协议和客户端端口号。

(6)服务器对 RTSP SETUP 响应,发出相应服务器端的端口号和会话标识符。

(7)客户端发出了 RTSP PLAY 的请求,目的是请求播放视频流。

(8)服务器对 RTSP PLAY 响应,响应的消息包括会话标识符,RTP 包的序列号,时间戳。此时服务器对 H264 视频流封装打包进行传输。

(9)客户端发出 RTSP TEARDOWN 请求,目的是关闭连接,终止传输。

(10)服务器关闭连接,停止传输。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值