对于QTSSReflectorModule里面的Describe消息只处理sdp类型的资源请求,其他类型的比如mov、mp4等资源会跳转到QTSSFileModule里面,其中mp4文件在Darwin源码中点播需要先hint下。如果想在增加多种视频格式那就要对FileModule进行扩展,在我们的项目中就优化了FileModule,实现了对mp4、avi等各种格式的文件的点播支持。后面的章节我们详细讨论。
【转载请注明出处】:http://blog.csdn.net/longlong530
1. 根据路径获取或者创建ReflectorSession,并获取对应请求的sdp文件绝对路径;
//eg theFilepath = "D:\MSU\Movies\141212100702059760.sdp" char *theFilepath = NULL; ReflectorSession* theSession = DoSessionSetup(inParams, qtssRTSPReqFilePath, false, NULL, &theFilepath ); OSCharArrayDeleter tempFilePath(theFilepath);
DoSessionSetup方法主要是调用FindOrCreateSession来对哈希表sSessionMap进行查询。
a) 没有根据inPath路径在哈希表sSessionMap中找到对应的ReflectorSession,那么就new一个.
b) 如果找到了就直接获取theSession = (ReflectorSession*)theSessionRef->GetObject();
最后调用SetupReflectorSession()方法
2. 如果已经有一个输出会话附属到这个客户端会话,那么就删除之;
if (theErr == QTSS_NoErr && theOutput != NULL) { RemoveOutput(*theOutput, (*theOutput)->GetReflectorSession(), false); RTPSessionOutput* theOutput = NULL; (void)QTSS_SetValue(inParams->inClientSession, sOutputAttr, 0, &theOutput, sizeof(theOutput)); }
3. 读取请求对应的sdp文件,将文件内容解析到StrPtrLen theFileData中;
4. 将连接信息清空,包括ip地址、端口号,如下面示例,同时增加一个字段a=control:*
操作前:c=IN IP4 192.168.10.177
操作后:c=IN IP4 0.0.0.0
操作前:m=video 20094 RTP/AVP 96
操作后:m=video 0 RTP/AVP
5. 检测sdp是否包含v、s、t、o这些字段,如果没有就构造补充进去;
6. SetSDPBuffer会调用SDP的解析方法paser(),在该方法内对SDP解析的同时,分析出该SDP是否合法,赋予属性fValid;
7. 将sdp的会话信息、媒体信息附在RTSP消息中响应给客户端.
【转载请注明出处】:http://blog.csdn.net/longlong530
声明:http://94it.net/ 这个网站的赵红霞一直在剽窃我的博客,行为及其恶劣!