精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
RTSP协议简介
RTSP交 互过程 :和http类似 (66.158是服务端,66.111是客户端)
C表 示RTSP客户端,S表示RTSP服务端
① C->S: OPTION request //询问S有 哪些方法可用 -----------------------------------------创建ServerMediaSession
S->C: OPTION response //S回 应信息中包括提供的所有可用方法
② C->S: DESCRIBE request //要求得到S提供 的媒体初始化描述信息
S->C: DESCRIBE response //S回 应媒体初始化描述信息,主要是sdp
③ C->S: SETUP request //设置会话属性,以及传输模式,提醒S建 立会话
S->C: SETUP response //S建 立会话,返回会话标识符及会话相关信息
④ C->S: PLAY request //C请求播放
S->C: PLAY response //S回 应请求信息 S->C: 发 送流媒体数据
⑤ C->S: TEARDOWN request //C请 求关闭会话 S->C: TEARDOWN response //S回应请求
上 述的过程是标准的RTSP流程,其中第3步和第4步是必需的。
如rtsp://192.168.1.1/urlPreSuffix/urlSuffix,urlPreSuffix作为stream name, urlSuffix作为subsession的trackId
void RTSPServer::RTSPClientConnection
::handleCmd_DESCRIBE(char const* urlPreSuffix, char const* urlSuffix, char const* fullRequestStr)
{
ServerMediaSession* session = NULL;
char* sdpDescription = NULL;
char* rtspURL = NULL;
do {
session = fOurServer.lookupServerMediaSession(urlTotalSuffix);----------找不到同名ServerMediaSession 时新建一个(GenericMediaServer& fOurServer,为什么把这个函数独立出去?面向对象思想编程感觉用的出神入化,真tm牛掰)
下面是创建ServerMediaSession的过程
static ServerMediaSession* createNewSMS(UsageEnvironment& env,char const*fileName, FILE* /*fid*/)
2. {
3. // Use the file name extension to determine the type of "ServerMediaS
ession":
4. char const* extension = strrchr(fileName, '.');
5. if (extension == NULL)
6. return NULL;
7.
8.
9. ServerMediaSession* sms = NULL;
Boolean const reuseSource = False;
if (strcmp(extension, ".aac") == 0) {
} else if (strcmp(extension, ".264") == 0) {----------------------------------------------------------------------------从此看出,对多个不同格式的媒体作出了不同的操作
// Assumed to be a H.264 Video Elementary Stream file:
NEW_SMS("H.264 Video");
OutPacketBuffer::maxSize = 100000; // ----------------------------------------------------------------------------------allow for some possibly large H.264 frames
sms->addSubsession(
H264VideoFileServerMediaSubsession::createNew(env, fileName,reuseSource));------------------H264VideoFileServerMediaSubsession的父类是ServerMediaSession,由此下面对ServerMediaSession指针的操作全是对H264VideoFileServerMediaSubsession的操作
} else if (strcmp(extension, ".mp3") == 0) {
}