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

相关文章

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

Java中实现对象的拷贝案例讲解

《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个

Git打标签从本地创建到远端推送的详细流程

《Git打标签从本地创建到远端推送的详细流程》在软件开发中,Git标签(Tag)是为发布版本、标记里程碑量身定制的“快照锚点”,它能永久记录项目历史中的关键节点,然而,仅创建本地标签往往不够,如何将其... 目录一、标签的两种“形态”二、本地创建与查看1. 打附注标http://www.chinasem.cn

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解