EasyDarwin

面向企业级的流媒体平台框架

EasyDarwin开始于2013年,遵循 Apple开源License APSL,为了敏捷流媒体服务器开发和简化企业流媒体应用开发而诞生的。

详细 >>

EasyDarwin进行实时直播视频转发的两种模式


一、首先引用Darwin开发文档里面的一段来介绍一下流转发的拉模式和推模式:Darwin支持两种自动播送的场景: 先拉后推。为了发起自动播送,RTSP客户会发送标准的RTSP请求...

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

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

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

先拉后推

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

先拉后推式

图1.先拉后推式

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

流媒体服务器A(转发服务器)发送标准的RTSP客户DESCRIBE/SETUP/PLAY请求给远程服务器,即流媒体服务器B。
发起请求的中继“客户端”(流媒体服务器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静态变量中

< MODULE NAME="QTSSRelayModule" >
< PREF NAME="relay_prefs_file" >./relayconfig.xml
< PREF NAME="relay_stats_url" >
< /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;非本站文章均来自互联网,转载目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责。
文章中如果有错误可联系:johnson@easydarwin.org
推荐文章
安防和移动互联网行业比较火热的移动端手机......>
有人问到像美拍、秒拍这些短视频拍摄是怎么......>
最近更新
Easydarwin中大量使用gettimeofday来获取系......>
最近很多EasyDarwin爱好者提出了手机移动端......>
第一个到达的音频RTP包就将作为音频的关键帧......>
打开手机直播立即就能显示出主播视频,其实就......>
h264的功能分为两层,视频编码层(VCL)和网......>
友情链接 | 申请链接
EasyDarwin官方微信!