ServerMediaSession类是Live555中用于管理一个媒体会话的核心类。它代表了一个可以被RTSP客户端访问的媒体流集合。一个ServerMediaSession实例通常对应一个媒体文件(例如一个.264文件或.mp3文件),或者一个实时的媒体源(如摄像头)。该类负责维护媒体的描述信息(SDP),并管理多个子会话(ServerMediaSubsession),每个子会话对应一个媒体轨道(如视频轨、音频轨)。
下面详细说明ServerMediaSession类的作用和细节:
作用
SDP生成:根据包含的媒体子会话生成整个媒体流的SDP描述信息。当RTSP客户端发送DESCRIBE请求时,服务器会返回这个SDP描述。
生命周期管理:管理媒体会话的生命周期,包括创建、引用计数、以及当没有客户端使用时销毁会话。
子会话管理:一个ServerMediaSession可以包含多个ServerMediaSubsession对象,每个对象代表一个媒体轨道(如视频、音频、字幕等)。ServerMediaSession负责这些子会话的添加、查找和删除。
流控制:配合子会话实现流的播放、暂停、跳转等控制。
唯一标识:每个ServerMediaSession有一个唯一的流名称(stream name),用于在RTSP URL中标识该会话。
细节
关键成员变量
fServerMediaSubsessions:一个链表,保存了所有的子会话(ServerMediaSubsession对象)。
fStreamName:字符串,表示该媒体会话的名称,用于构建RTSP URL。
fDescription:字符串,用于SDP中的会话描述。
fInfo:字符串,用于SDP中的会话信息。
fMisc:字符串,用于SDP中的其他信息。
fReferenceCount:引用计数,当没有客户端引用该会话时,会话会被销毁。
关键成员函数
构造函数和析构函数
ServerMediaSession::ServerMediaSession(UsageEnvironment& env, char const* streamName, char const* info, char const* description, Boolean isSSM, char const* misc)
创建一个新的媒体会话,并初始化描述信息。
添加和删除子会话
void addSubsession(ServerMediaSubsession* subsession)
将一个子会话添加到媒体会话中。
生成SDP
char* generateSDPDescription()
生成完整的SDP描述。它会遍历所有子会话,调用每个子会话的sdplines()方法,然后将所有子会话的SDP信息组合起来。
查找子会话
ServerMediaSubsession* findSubsession(char const* trackId)
根据轨道ID(track id)查找对应的子会话。
引用计数管理
void incrementReferenceCount()
void decrementReferenceCount()
用于管理会话的引用计数。当引用计数减到0时,会话会被销毁。
其他辅助函数
char const* streamName() const:返回流名称。
Boolean streamsSSM() const:返回是否使用SSM(Source-Specific Multicast)。
使用流程
创建ServerMediaSession:当服务器需要提供一个新的媒体流时,首先创建一个ServerMediaSession对象,并设置流名称和描述信息。
创建并添加子会话:为每个媒体轨道创建对应的ServerMediaSubsession子类对象(如H264VideoFileServerMediaSubsession),并将其添加到ServerMediaSession中。
注册到RTSPServer:将ServerMediaSession对象注册到RTSPServer中,关联一个RTSP URL路径。
客户端访问:当客户端通过RTSP URL访问时,服务器会找到对应的ServerMediaSession,生成SDP并返回给客户端。
客户端设置和播放:客户端根据SDP描述设置每个子会话的传输参数,然后发送PLAY请求。服务器会开始通过RTP发送媒体数据。
销毁:当所有客户端都离开后,引用计数变为0,ServerMediaSession被销毁。
示例代码片段
以下是一个创建ServerMediaSession并添加一个H.264视频子会话的示例:
// 创建ServerMediaSession
ServerMediaSession* sms = ServerMediaSession::createNew(env, "testStream",
"Test Stream",
"This is a test stream",
False, "");
// 创建H.264视频子会话(假设fileName是H.264文件名)
ServerMediaSubsession* subsession = H264VideoFileServerMediaSubsession::createNew(env, fileName, False);
if (subsession == NULL) {
// 处理错误
return;
}
sms->addSubsession(subsession);
// 将ServerMediaSession注册到RTSPServer
rtspServer->addServerMediaSession(sms);
// 获取用于访问的RTSP URL
char* url = rtspServer->rtspURL(sms);
在live555MediaServer程序中,当RTSPServer::RTSPClientSession::handleCmd_SETUP()收到rstp setup消息时调用DynamicRTSPServer::lookupServerMediaSession(),然后在此函数中创建ServerMediaSession,并根据文件类型调用addSubsession(xxx)。
3801

被折叠的 条评论
为什么被折叠?



