ve555代码解读之二:DESCRIBE请求消息处理过程
RTSP服务器收到客户端的DESCRIBE请求后,根据请求URL(rtsp://192.168.1.109/1.mpg),找到对应的流媒体资源,返回响应消息。live555中的ServerMediaSession类用来处理会话中描述,它包含多个(音频或视频)的子会话描述 (ServerMediaSubsession)。
上节我们谈到RTSP服务器收到客户端的连接请求,建立了RTSPClientSession类,处理单独的客户会话。在建立 RTSPClientSession的过程中,将新建立的socket句柄(clientSocket)和RTSP请求处理函数句柄 RTSPClientSession::incomingRequestHandler传给任务调度器,由任务调度器对两者进行一对一关联。当客户端发出 RTSP请求后,服务器主循环中的select调用返回,根据socket句柄找到对应的incomingRequestHandler,开始消息处理。先进行消息的解析,如果发现请求是DESCRIBE则进入handleCmd_DESCRIBE函数。根据客户端请求URL的后缀(例如是1.mpg), 调用成员函数DynamicRTSPServer::lookupServerMediaSession查找对应的流媒体信息 ServerMediaSession。如果ServerMediaSession不存在,但是本地存在1.mpg文件,则创建一个新的 ServerMediaSession。在创建ServerMediaSession过程中,根据文件后缀.mpg,创建媒体MPEG-1or2的解复用器(MPEG1or2FileServerDemux)。再由MPEG1or2FileServerDemux创建一个子会话描述 MPEG1or2DemuxedServerMediaSubsession。最后由ServerMediaSession完成组装响应消息中的SDP信息(SDP组装过程见下面的描述),然后将响应消息发给客户端,完成一次消息交互。
SDP消息组装过程:
ServerMediaSession负责产生会话公共描述信息,子会话描述由 MPEG1or2DemuxedServerMediaSubsession产生。 MPEG1or2DemuxedServerMediaSubsession在其父类成员函数 OnDemandServerMediaSubsession::sdpLines()中生成会话描述信息。在sdpLines()实现里面,创建一个虚构(dummy)的FramedSource(具体实现类为MPEG1or2AudioStreamFramer和 MPEG1or2VideoStreamFramer)和RTPSink(具体实现类为MPEG1or2AudioRTPSink和 MPEG1or2VideoRTPSink),最后调用setSDPLinesFromRTPSink(...)成员函数生成子会话描述。
以上涉及到的类以及继承关系:
Medium <- ServerMediaSession
Medium <- ServerMediaSubsession <- OnDemandServerMediaSubsession <- MPEG1or2DemuxedServerMediaSubsession
Medium <- MediaSource <- FramedSouse <- FramedFileSource <- ByteStreamFileSource
Medium <- MediaSource <- FramedSouse <- MPEG1or2DemuxedElementaryStream
Medium <- MPEG1or2FileServerDemux
Medium <- MPEG1or2Demux
Medium <- MediaSource <- FramedSouse <- MPEG1or2DemuxedElementaryStream
Medium <- MediaSource <- FramedSouse <- FramedFilter <- MPEGVideoStreamFramer <- MPEG1or2VideoStreamFramer
Medium <- MediaSink <- RTPSink <- MultiFramedRTPSink <- VideoRTPSink <- MPEG1or2VideoRTPSink
分享到:
相关推荐
简单分析了live555中的RTSP相关代码实现流程,重要的函数说明。 主要包括: 1,RTSPserver创建过程分析 2,DESCRIBE命令处理流程 3,SETUP命令处理流程。
要查询 MySQL 数据库中表的结构,可以使用 DESCRIBE 语句或 SHOW COLUMNS 语句。这些语句可以向用户提供有关表的详细信息, 如列名、 数据类型、键信息等。 1. DESCRIBE 语句: 使用 DESCRIBE 语句可以获取表的...
要查询 MySQL 数据库中表的结构,可以使用 DESCRIBE 语句或 SHOW COLUMNS 语句。这些语句可以向用户提供有关表的详细信息, 如列名、 数据类型、键信息等。 1. DESCRIBE 语句: 使用 DESCRIBE 语句可以获取表的...
pandas.Series(len_sequences).describe() 的示例理解代码,帮助理解四元数。
PB describe Evaluate LookUpDisplay用法,仅供参考!
基本原理当开发人员修复测试,他们可以通过使用过滤方法测试简化这个过程only在it与describe 。 但是,当项目在CI上运行时,此类过滤器不应位于存储库中。 因此,我们将此规则添加到以only检查测试文件中是否存在。 ...
RxJava Retrofit封装,包含对相同格式请求数据、相同格式返回数据处理,显示Material Design加载dialog,文件上传下载进度展示、全局异常捕捉。 Preview 演示中upload.png为上传图片源文件。 Describe 实现功能: 1...
live555 流媒体开源技术
from describe import Mock, stub, expect, verify_mock # Primary features from describe import flags # Argument matching 用法 快速开始 描述的核心是期望对象。 在以前的版本中,它被称为Value对象: from ...
mysql desc命令用于查看表结构,是DESCRIBE命令的简写形式。 mysql desc命令语法: desc tablename 该命令会显示表哪些信息呢?具体包括: 字段名称(Field) 字段类型(Type) 字段是否为null 字段是否为主键(key)...
data-describe一直在寻求提升探索性数据分析的标准。这里只是一些实现的方法: 降维方法 敏感数据(PII)编辑 文本预处理/主题建模 大数据支持 安装 可以使用pip安装data-describe: pip install data-describe ...
Describe-it是一个鼻子插件,它使您可以编写单元测试,而该单元测试更像是组件如何工作的可执行示例,而不仅仅是被测试。 另一个好处是能够描述组件在某些上下文中的行为,其中一个上下文可以通过使用嵌套在先前...
Describe the products that make up the Microsoft BI platform. Module 2: Creating Multidimensional Databases This module describes how to create multidimensional databases using SQL Server Analysis ...
Description: Describe the methods (or tools) you used to analyze the features and why they can be helpful. Also, give a brief introduction of Naïve Bayes models (in your own words). Our team used R ...
DESCRIBE.png libstreaming RTCP describe交互细节,经典。
示例代码: describe(@"Team", ^{ context(@"when newly created", ^{ it(@"should have a name", ^{ id team = [Team team]; [[team.name should] equal:@"Black Hawks"]; }); it(@"should have 11 ...
git-describe-semver :herb: :memo: :package: 始终从$(git-describe --long)获取有效的 SemVer! 概念验证,目前需要全局安装 CoffeeScript ( /usr/bin/env coffee )。 将以编译后的 js 形式发布到 npm。 快速...
拉取请求 模板 ### Related Issue resolve: # ### What does this PR do? - ### Why are we doing this? - ### Screenshots 合并选项 Hackathon:1个或更多代码审查 之后:2个或更多代码审查 建筑学 MVVM 代码风格 ...
对于字符串,每个字符都以相同的方式处理。 通过支持任意数量的数字。 使用describe-number-at-point上点/区域或describe-number输入值手动。 最好将describe-number-at-point绑定到某个键: ( global-set-key ...
请求媒体服务器DESCRIBE特定的媒体流。 响应中的会话描述被写入SDP文件。 通过指定传输协议请求媒体服务器SETUP特定的媒体流。 请求媒体服务器PLAY选择的媒体流。 请求当前会话的TEARDOWN 。 示例输出 $./curl_...