前面几篇文章分析了 live555 中 RTSP 的处理逻辑,RTSP 处理有关组件的处理逻辑有点复杂,本文就再来梳理一下它们之间的关系。
live555 中 RTSP 处理有关组件关系如下图:
事件和执行流程的源头在 TaskScheduler
。GenericMediaServer
对象在创建的时候,会向 TaskScheduler
注册一个 server socket 及处理该 socket 上的事件的处理程序 GenericMediaServer::incomingConnectionHandler(void* instance, int /*mask*/)
。
当有客户端连接服务器时,触发 server socket 上的事件处理器执行。此时会基于客户端 socket 创建 ClientConnection
对象,及 RTSPClientConnection
。 RTSPClientConnection
对象在创建过程中,会将该客户端 socket 及
ClientConnection
中处理该 socket 上的事件的处理程序 GenericMediaServer::ClientConnection::incomingRequestHandler(void* instance, int /*mask*/)
注册给 TaskScheduler
。
在客户端发送的 RTSP 请求数据到达之后,GenericMediaServer::ClientConnection
会读取这些数据,并交给 RTSPServer::RTSPClientConnection::handleRequestBytes(int newBytesRead)
处理。
RTSPServer::RTSPClientConnection
解析 RTSP 请求,并处理 OPTIONS
、DESCRIBE
和 ``SETUP 等无需流媒体会话建立即可处理的请求。
RTSPServer::RTSPClientConnection
在处理 SETUP
请求时,会创建流媒体会话的 RTSPServer::RTSPClientSession
,具体的会话建立过程都会被委托给后者处理。
需要会话建立之后才能处理的请求,也会被交给 RTSPServer::RTSPClientSession
处理。
这里来看一下 RTSPServer::RTSPClientConnection
的完整定义:
RTSPServer::RTSPClientConnection
继承自 GenericMediaServer::ClientConnection
:
从它们的定义,不难理解它们的职责主要在于处理网络 I/O,处理 RTSP 请求,并建立会话。
再来看 RTSPServer::RTSPClientSession
的定义:
RTSPServer::RTSPClientSession
继承自 GenericMediaServer::ClientSession
:
不难理解 RTSPServer::RTSPClientSession
用于封装整个流媒体会话,处理那些要求流媒体会话已经建立的 RTSP 请求,如 PLAY
等。
具体的流媒体数据的交互,如音视频文件/数据的解析,RTP/RTCP 数据的打包及收发等,则依赖于 ServerMediaSession
和 ServerMediaSubsession
。
打赏
Done.
live555 源码分析系列文章
live555 源码分析:简介
live555 源码分析:基础设施
live555 源码分析:MediaSever
Wireshark 抓包分析 RTSP/RTP/RTCP 基本工作过程
live555 源码分析:RTSPServer
live555 源码分析:DESCRIBE 的处理
live555 源码分析:SETUP 的处理
live555 源码分析:PLAY 的处理
live555 源码分析:RTSPServer 组件结构
live555 源码分析:ServerMediaSession
live555 源码分析:子会话 SDP 行生成
live555 源码分析:子会话 SETUP
live555 源码分析:播放启动