一、首先引用Darwin开发文档里面的一段来介绍一下流转发的拉模式和推模式:

Darwin支持两种自动播送的场景:

  • 先拉后推。为了发起自动播送,RTSP客户会发送标准的RTSP请求来向服务器请求一个流,然后服务器将该流中继到一个或者多个流媒体服务器。这种场景在"先拉后推"部分中加以描述。
  • 先侦听后推送。在这个场景中,自动播送在流媒体服务器接收到ANNOUNCE请求时被发起。这个场景在"先侦听后推送"部分中进行描述。

先拉后推

用户可以通过发送标准的DESCRIBE/SETUP/PLAY请求来向远程的源中请求一个流,然后将它中继转发到一个或者多个目的地。当只希望让外部流的一份拷贝占用其内部连接的带宽时,这个功能可能有用。中继转发获取一份拷贝进行多份的复制和转发、分发到请求的客户端。图 1.提供了一个先拉后推(pull-then-push)场景的实例。

图1.先拉后推式

图1.作为参考,先拉后推场景的步骤如下:

  1. 流媒体服务器A(转发服务器)发送标准的RTSP客户DESCRIBE/SETUP/PLAY请求给远程服务器,即流媒体服务器B。
  2. 发起请求的中继“客户端”(流媒体服务器A)开始接受流,然后向该输入流的中继配置中列出的所有目的地发送ANNOUNCE推送请求。

注意:我们在实际的需求中常常遇到的场景为,客户端的请求触发转发服务器以拉模式从前端设备或者其他流媒体服务器获取视频后,再传输给客户端,是一种先拉后拉(pull-then-pull)模式,如果客户端请求的视频流存在,则直接转发已经获取的拷贝进行分发,这个是我们后面在对Darwin做二次开发中所需要做的

先侦听后推送

流媒体服务器可以被配置为将ANNOUNCE请求创建的输入流自动发送到一个或者多个目的地。这可能可以用于配制自动播送网络。图 2.提供了一个先侦听后推送的场景的实例。

图2.先侦听后推送式

图2.作为参考,先侦听后推送场景的步骤如下:

  • 远程机器(IpCamera等前端设备或者中继服务器)向流媒体服务器A发送一个ANNOUNCE请求。流媒体服务器可以接受或者否认这个请求。如果它接受了请求,则流媒体服务器会检查其中继配置,以确定这个流是否应该被中继。
  • 如果该流应该被中继,则流媒体服务器将向自身发送标准的RTSP客户DESCRIBE/SETUP/PLAY请求。
  • 发出请求的中继“客户”(流媒体服务器A)开始接收流,然后向相应的输入流的中继配置中列出的所有目的地发送一个ANNOUCE请求。

注意:我们在实际的需求中常常遇到的场景为,前端设备RTSP Announce上线至中继服务器,上报其流媒体SDP信息,前端设备再经过'被触发',通过SETUP/PLAY流程发起流推送,客户端再以拉模式拉取实时视频流,是一种先推后拉(push-then-pull)模式,如果客户端请求的视频流存在,则直接转发已经获取的拷贝进行分发,这个又是我们后面在对Darwin做二次开发中所需要做的,"我怎么说又了"!

在缺省情况下,认证对于自动播送是必要的。来自播送器的ANNOUNCE请求需要通过服务器中活跃的认证机制来过滤。为了支持播送认证,需要在qtaccess文件中加入一个新的WRITE指令。这个新的指令使得SDP文件可以被写入到媒体文件夹(Darwin中为Movies文件夹)中。

二、Darwin中实现转发和分发的具体类

在Darwin中,实现拉模式转发的模块为QTSSRelayModule,每一路转发会话为一个RelaySession对象,转发列表存储于队列sSessionQueue中

QTSSRelayModule一开始Initialize()读取配置文件中关于转发文件路径存储于sRelayPrefs静态变量中

[html] view plaincopy
  1. <MODULE NAME="QTSSRelayModule" >
  2. <PREF NAME="relay_prefs_file" >./relayconfig.xml</PREF>
  3. <PREF NAME="relay_stats_url" ></PREF>
  4. </MODULE>

在ReadRelayPrefsFile()中读取sRelayPrefs中配置并解析出分发列表,并对每一个分发配置中的source配置创建RelaySessionCreator开启分发,并加入到sSessionQueue中,RTSPSourceInfo::RelaySessionCreator::Run() 再通过RTSPSourceInfo::RunCreateSession()开始DESCRIBE/SETUP/PLAY拉取数据,RTSP流程成功后,再配置RTP数据分发的地址,将RTP数据推送至分发列表(即destination列表与source列表同一级)中,即实现了Darwin文档中所述的先拉后推模式,那么我们如何实现服务器基于客户端请求的全拉模式(On Demand)转发,在后续的文档中将推出。

那么如何实现推模式的转发呢,这个也很简单,而且有现成的代码可以用,在Darwin中的QTSSReflectorModule接受来自live555的DarwinInjector通过Annonce/SETUP(push mode)/PLAY过程,模拟前端设备,推送视频流至Darwin,Darwin再将每一个客户端的请求加入到QTSSReflectorModule中ReflectorSession的Output列表中,进行分发,即可实现先推后拉模式的转发,那么如何实现On Demand方式的先推后拉,我们在后面的文章中也会推出,并会附上部分代码,敬请期待!

--------------------------------------------------------

在EasyDarwin进行实时视频转发的两种模式相关推荐

  1. epoll的两种模式

    From: http://haoningabc.iteye.com/blog/1432958 linux异步IO浅析  http://hi.baidu.com/_kouu/blog/item/e225 ...

  2. 华为防火墙ftp_常用的FTP两种模式,主动模式和被动模式,一分钟了解下

    FTP支持两种模式,一种方式叫做Standard (也就是 PORT方式,主动方式),一种是 Passive(也就是PASV,被动方式). 一.FTP服务器工作两种模式 1.主动模式 2.被动模式 针 ...

  3. 2021-12-23 网工基础(十四) 链路聚合的两种模式、堆叠、集群、IP路由基础

    一 链路聚合的两种模式 1.手工模式(管理员手工指定,无协议报文.没有开销) 2.LACP模式(交换机之间会交互LACP的协议,会有一点儿报文交互)一般正常情况下推荐使用LACP模式. 一般自动协商都 ...

  4. Epoll两种模式浅析(ET or LT)

    linux异步IO浅析  http://hi.baidu.com/_kouu/blog/item/e225f67b337841f42f73b341.html epoll有两种模式,Edge Trigg ...

  5. 2021年大数据Spark(九):Spark On Yarn两种模式总结

    目录 Spark On Yarn两种模式 引入 一.当一个MR应用提交运行到Hadoop YARN上时 二.当一个Spark应用提交运行在集群上时 注意 client 模式 cluster 模式 总结 ...

  6. 简述python中怎样导入模块_Python中导入模块的两种模式,import

    import import pandas import pandas as pd 使用函数方式:.(),或者.() 比如 pandas.read_csv("data/stock.csv&qu ...

  7. FTP的两种模式和在实际工作中应用

    FTP是一种文件传输协议,它支持两种模式,一种方式叫做Standard (也就是 Active,主动方式),一种是 Passive (也就是PASV,被动方式). Standard模式 FTP的客户端 ...

  8. 备忘: VC++ 自动适用编译两种模式库文件 (DLL, LIB)

    为什么80%的码农都做不了架构师?>>>    一个好的程序设计规划总会有属于自己的基础代码库.重用这些代码库,DLL或LIB方式最好的选择之一.在写新的项目或程序是,我们不可能每次 ...

  9. Doctype? 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?

    严格模式与混杂模式--如何触发这两种模式,区分它们有何意义. 在标准模式中,浏览器根据规范呈现页面: 在混杂模式中,页面以一种比较宽松的向后兼容的方式显示. 浏览器根据DOCTYPE是否存在以及使用的 ...

最新文章

  1. do还是doing imagine加to_中学必背英语短语集合:54个doing动名词的固定搭配
  2. 利用编码特长,我赚取了每月1000美元的额外收入
  3. Node.js链式回调
  4. Binder实用指南(一) - 理解篇
  5. 三重积分平均值_2015考研数学考前必须死磕的知识点
  6. 创建Podfile,添加类库,中途添加库指令
  7. Redis的高可用详解:Redis哨兵、复制、集群的设计原理,以及区别
  8. CentOS7.4安装及断网问题解决方案
  9. com.alibaba.fastjson.JSONException: can‘t create non-static inner class inst
  10. java多线程与线程间通信
  11. 强悍的 Linux —— 常用 shell
  12. SAP与GE开展工业物联网合作
  13. 机器人教室外墙_智慧教室之机器人创客教室建设方案
  14. linux用cat建文件,如何使用Linux cat命令
  15. 无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装
  16. JavasScript 第二天课 课后笔记 2022.3.24
  17. 成语——》寻找心中的巴拿马
  18. Photo Album: Wicresoft
  19. DMIPS, FLOPS, OPS概念
  20. 人工智能会破灭嘛?听听福布斯邀请的这50位大拿怎么说

热门文章

  1. osgEarth的Rex引擎原理分析(一零九)19级瓦片分辨率估算
  2. Lecture 3——DNA-seq-1
  3. 《增长黑客》- 读书笔记(三)北极星指标拆解
  4. SD-WAN 系列 (4)MPLS 企业专线到底有多贵?
  5. pandas 两列相乘 dataframe
  6. python print用法可以不加引号吗_第一课print() 函数的用法有以下几种:单刀赴会—不带引号...
  7. Android打开和关闭输入法
  8. 简单易用的运动控制卡(十四):PWM、模拟量输出与运动控制的同步
  9. 主机与虚拟机不能ping通“VMware Network Adapter VMnet8”未启用 DHCP
  10. jquery.media.js 插件实现在线预览PDF文件