LIVE555学习5:testOnDemandRTSPServer例程解析

2024-05-27 09:38

本文主要是介绍LIVE555学习5:testOnDemandRTSPServer例程解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1 主函数
  • 2 ServerMediaSession
  • 3 Source 和 Sink

关于testOnDemandRTSPServer例程分析,网上有很多文章,有些写的非常详细,将涉及到的每个函数以及类进行了详细讲解,看了之后很有收获,可是让自己写是如何也写不出来的。只是将自己输入的内容有个输出,防止以后遗忘。。。

1 主函数

主函数如下,只列出了H264,去掉了其他类型:

int main(int argc, char** argv) {// Begin by setting up our usage environment:TaskScheduler* scheduler = BasicTaskScheduler::createNew(); //创建任务调度器env = BasicUsageEnvironment::createNew(*scheduler); //创建交互环境/* 权限控制 */UserAuthenticationDatabase* authDB = NULL;
#ifdef ACCESS_CONTROL// To implement client access control to the RTSP server, do the following:authDB = new UserAuthenticationDatabase;authDB->addUserRecord("username1", "password1"); // replace these with real strings// Repeat the above with each <username>, <password> that you wish to allow// access to the server.
#endif// Create the RTSP server,端口8554RTSPServer* rtspServer = RTSPServer::createNew(*env, 8554, authDB);if (rtspServer == NULL) {*env << "Failed to create RTSP server: " << env->getResultMsg() << "\n";exit(1);}char const* descriptionString= "Session streamed by \"testOnDemandRTSPServer\"";// Set up each of the possible streams that can be served by the// RTSP server.  Each such stream is implemented using a// "ServerMediaSession" object, plus one or more// "ServerMediaSubsession" objects for each audio/video substream.// A H.264 video elementary stream:{char const* streamName = "stream0";  //流名字char const* inputFileName = "output.h264";  //文件名// 创建媒体会话,当客户点播流的时候,会输入流的名字即上文的”stream0”,用来告诉RTSP服务器点播的是那个流ServerMediaSession* sms= ServerMediaSession::createNew(*env, streamName, streamName, descriptionString);//添加子会话,当点播此流的时候,会打开inputFileName指定的文件,即打开“output.h264”sms->addSubsession(H264VideoFileServerMediaSubsession::createNew(*env, inputFileName, reuseFirstSource));//为rtspserver添加sessionrtspServer->addServerMediaSession(sms);//打印信息到标准输出announceStream(rtspServer, sms, streamName, inputFileName);}if (rtspServer->setUpTunnelingOverHTTP(80) || rtspServer->setUpTunnelingOverHTTP(8000) || rtspServer->setUpTunnelingOverHTTP(8080)) {*env << "\n(We use port " << rtspServer->httpServerPortNum() << " for optional RTSP-over-HTTP tunneling.)\n";} else {*env << "\n(RTSP-over-HTTP tunneling is not available.)\n";}env->taskScheduler().doEventLoop(); // does not returnreturn 0; // only to prevent compiler warning
}

上面便是主函数的全部内容,在函数起始部分会先创建一个任务调度器用于以后进行任务事件调度用,关于任务调度、计划任务这一部分在前面文章《IVE555学习3:live555MediaServer讲解——Live555从启动到响应Client过程分析》中有过介绍。

然后会创建一个交互环境env,用于输出一些信息。这些其实是创建一个RTSP服务器的标准流程,就不详细介绍了。

随后,会创建一个RTSPServer实例,端口号为8554.随后将其加入计划任务,当监听到Client的请求时候,会调用对应的handler函数进行响应,这一部分在前面文章《IVE555学习3:live555MediaServer讲解——Live555从启动到响应Client过程分析》也有过分析。

2 ServerMediaSession

在创建完RTSPServe实例后,会看到又创建了一个媒体会话ServerMediaSession, 然后将H264VideoFileServerMediaSubsession添加到ServerMediaSession会话中,然后又将ServerMediaSession添加进创建的RTSPServe实例中去。

H264VideoFileServerMediaSubsession通过分析发现是FileServerMediaSubsession的子类,FileServerMediaSubsession又是OnDemandServerMediaSubsession的子类,OnDemandServerMediaSubsession又是ServerMediaSubsession的子类。

关于上面的ServerMediaSession和ServerMediaSubsession我们可以简单理解如下:
一个ServerMediaSession对象对应一个媒体文件,一个媒体文件中可能同时包含音频和视频,对于每个视频或者音频,对应一个ServerMediaSubsession对象,所以一个ServerMediaSession可以有多个ServerMediaSubsession。

关于ServerMediaSession更详细的,可以参考下面的博客:
live555 源码分析:ServerMediaSession
https://www.wolfcstech.com/2017/09/07/live555_src_analysis_servermediasession/

3 Source 和 Sink

在H264VideoFileServerMediaSubsession中,需要提供其父类OnDemandServerMediaSubsession进行I/O操作时候需要的Source和Sink.
实现如下:

FramedSource* H264VideoFileServerMediaSubsession::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) {estBitrate = 500; // kbps, estimate// Create the video source:ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(envir(), fFileName);if (fileSource == NULL) return NULL;fFileSize = fileSource->fileSize();// Create a framer for the Video Elementary Stream:return H264VideoStreamFramer::createNew(envir(), fileSource);
}

上面的Source和Sink的调用是在RTSP会话中的SETUP中进行调用的。

在SETUP会话中,有调用到subsession->getStreamParameters,这个虚函数在OnDemandServerMediaSubsession类中被实现,在getStreamParameters中,可以看到先后调用了createNewStreamSource和createNewRTPSink来创建,然后将其进行关联。

在上面创建的source中,我们可以看到ByteStreamFileSource这个类是通过void ByteStreamFileSource::doReadFromFile();从本地文件中读取数据。

其实这一部分也是我们需要着重关注的,如果想基于Live555实现直播流,就需要重写Source和Sink这一部分,将视频流的获取改写为实时流。

这篇关于LIVE555学习5:testOnDemandRTSPServer例程解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

利用Python和C++解析gltf文件的示例详解

《利用Python和C++解析gltf文件的示例详解》gltf,全称是GLTransmissionFormat,是一种开放的3D文件格式,Python和C++是两个非常强大的工具,下面我们就来看看如何... 目录什么是gltf文件选择语言的原因安装必要的库解析gltf文件的步骤1. 读取gltf文件2. 提

Java中的runnable 和 callable 区别解析

《Java中的runnable和callable区别解析》Runnable接口用于定义不需要返回结果的任务,而Callable接口可以返回结果并抛出异常,通常与Future结合使用,Runnab... 目录1. Runnable接口1.1 Runnable的定义1.2 Runnable的特点1.3 使用Ru

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx