LIVE555学习4:live555MediaServer讲解——如何根据指定文件后缀创建ServerMediaSession

本文主要是介绍LIVE555学习4:live555MediaServer讲解——如何根据指定文件后缀创建ServerMediaSession,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在前面《LIVE555学习1:Linux下live555的编译及测试》中,当我们运行起可执行程序live555MediaServer,在VLC中输入rtsp://192.168.1.100/Titanic.ts, 便可以播放ts流。当我们输入其他格式,如H264、H265、aac等,均可以输出对应流。但是在主函数中,只创建了一个RTSPServer实例,并没有创建这些对应不同格式文件的ServerMediaSession和ServerMediaSubSession.

上一篇中也大致介绍了RTSP服务运行的整个流程,但是没有对代码进行详细的讲解,所以并不清楚ServerMediaSession是如何创建的,什么时候创建的,如何根据不同的文件格式进行创建不同的对象。。。。

在RTSP会话过程中,再DESCRIBE和SETUP中,会来确定ServerMediaSession是否存在。具体实现在DynamicRTSPServer.cpp中,在函数lookupServerMediaSession中,会进行以下检查:

  • ①检查ServerMediaSession是否存在
  ServerMediaSession* sms = RTSPServer::lookupServerMediaSession(streamName);Boolean smsExists = sms != NULL;
  • ②判断文件是否存在,如果文件没了,
    ServerMediaSession有,则删除ServerMediaSession
  if (!fileExists) {if (smsExists) {// "sms" was created for a file that no longer exists. Remove it:removeServerMediaSession(sms);sms = NULL;}
  • ③最终根据判断结果来决定是否创建
ServerMediaSessionif (sms == NULL) {sms = createNewSMS(envir(), streamName, fid);addServerMediaSession(sms);}

若是需要创建ServerMediaSession,则会调用createNewSMS,在此函数中,也做了几件事:

  • ①确定文件后缀
  char const* extension = strrchr(fileName, '.');if (extension == NULL) return NULL;
  • ②根据文件后缀来创建对应的ServerMediaSession和ServerMediaSubSession
    例如H264:
  }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 framessms->addSubsession(H264VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource));
}

例如H265:

  } else if (strcmp(extension, ".265") == 0) {// Assumed to be a H.265 Video Elementary Stream file:NEW_SMS("H.265 Video");OutPacketBuffer::maxSize = 100000; // allow for some possibly large H.265 framessms->addSubsession(H265VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource));
}

结束。根据以上的分析可以知道,在程序运行时候,会首先创建一个RTSPServer实例,然后会根据RTSP会话传递过来的文件格式来创建对应的ServerMediaSession和ServerMediaSubSession。

这篇关于LIVE555学习4:live555MediaServer讲解——如何根据指定文件后缀创建ServerMediaSession的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007116

相关文章

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P