在前面 live555 源码分析:子会话 SDP 行生成 一文中,我们看了 live555 中子会话 ServerMediaSubsession
的生命周期,并较为详细地分析了生成 SDP 行的 sdpLines()
,本文继续分析这一生命周期。
获取流参数
ServerMediaSubsession
的 getStreamParameters()
函数在执行 RTSP 的 SETUP
请求时调用,该函数的实现如下:
这个函数主要用于获取为会话分配的 RTP 端口和 RTCP 端口,以及 stream token。OnDemandServerMediaSubsession
用 StreamState
来管理底层的输入输出组件,并以 StreamState
对象的指针作为 stream token。
当会话的 StreamToken 已经存在时,即 fLastStreamToken
非空时,请求的信息直接返回给调用者。当会话的 StreamToken 还不存在时,则需要创建底层用于 I/O 的设施,然后将请求的信息返回。
这里我们主要来看流模式为 RTP 的情况,并忽略 RTP 端口号与 RTCP 端口号复用的情况。对于要创建 StreamState
的情况,创建动作主要通过如下一些步骤来完成:
第一步,创建 FramedSource
。
第二步,尝试创建端口号相邻的一对 groupsocks,分别用于 RTP 和 RTCP,其中 RTP 端口号为偶数,RTCP 端口号为奇数。然后基于 RTP 的 groupsock 创建 RTPSink
。最后对这些 groupsocks 做一些设置,包括清除 RTP 和 RTCP 的 groupsocks 的目标地址,以及增大 RTP 的 groupsock 的发送缓冲区。
第三步,基于前面创建的 FramedSource
、RTP 和 RTCP 的 groupsock 和 RTPSink
等创建 StreamState
,并返回给调用者。
getStreamParameters()
最后还会创建 Destinations
。Destinations
封装了客户端的地址,及 RTP 和 RTCP 端口号。
live555 中的某些 get 和 lookup 操作暗含着在不存在的情况下创建的语义,如这里的 getStreamParameters()
,还有 GenericMediaServer
的 lookupServerMediaSession()
。
播放前的设置
接下来看一下,在 RTSP 的 PLAY
请求处理中,播放流媒体之前做的设置。这主要包括 setStreamScale()
、seekStream()
、nullSeekStream()
和 getCurrentNPT()
等操作。
对于 H264VideoFileServerMediaSubsession
而言,这些操作的实现也都在 OnDemandServerMediaSubsession
中。
setStreamScale()
的实现如下:
setStreamScale()
用于设置流媒体播放的快慢,它将实际的工作委托给 setStreamSourceScale()
,后者是 OnDemandServerMediaSubsession
新加的虚函数,需要子类实现来提供实际的功能。
对于 H264VideoFileServerMediaSubsession
来说,设置播放快慢的操作为空操作。
seekStream()
的实现如下:
seekStream()
用于控制播放进度,它们的实际功能同样需要子类实现新定义的两个虚函数来实现。
nullSeekStream()
的实现如下:
nullSeekStream()
用于设置播放的时长,同样需要子类实现新的虚函数,即 setStreamSourceDuration()
来提供实际的功能。
getCurrentNPT()
用于获取当前 NPT 时间:
这里通过使用起始的 NPT 时间加上 RTP 会话经过的时间长度来计算获得。
打赏
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 源码分析:播放启动