分布式直播系统(四)【nginx-rtmp流媒体直播服务器单集群实现方式】

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

转载请注明出处:https://blog.csdn.net/impingo
项目地址:https://github.com/im-pingo/pingos

关键词

  • 调度服务器:调度服务器是一个http接口服务器,它用来记录一路直播流在哪台服务器上发布,并且提供http接口用来查询流对应的服务器地址。

  • 回源:假设当前有两台服务器A和B,服务器A上存在某条流S,此时有播放端向服务器B请求流S,由于服务器B上不存在该条流所以服务器B只有向服务器A请求此条流,这种情况成为回源。

  • 动态回源:原理与上述“回源”描述一样,只不过回源地址可以通过http响应告诉拉流服务器(上述中的服务器B),这样就可以动态地切换目标源地址。
    动态回源

  • 静态回源:与动态回源相对应的一种回源方式,与动态回源不同的是回源地址一般通过服务器配置文件决定,也就是说一旦配置文件固定则目标源地址也就确定,不能动态切换源。
    在这里插入图片描述

  • 转推:假设当前有两台服务器A和B,某主播向服务器A推送流S,服务器A收到流S后立即向服务器B推送该条流,则这种情况被称为转推。

  • 动态转推:原理与上述“转推”描述一样,只不过是在转推前先向调度服务器请求转推服务器地址,这样就可以做到动态切换转推目标服务器。
    在这里插入图片描述

  • 静态转推:与“动态转推”类似,只不过转推地址是在配置文件中固定填写的。
    静态转推

单集群方案

单集群是指部署在同一个物理节点的N台媒体服务器协同提供服务。主播推流到其中一台机器上,观众从集群中任意一台服务器拉流都可拉流成功。通过这种方式可以将服务器出口压力分散到多台机器上。
想要实现回源和转推功能需要用到nginx-rtmp中的pull_module、push_module和oclp_module,以下会给出详细的配置方式。

静态转推

通过push配置可以将推送到该服务器的流转推到push指定的服务器。

rtmp {
    server {
        listen 1935;
        application live {
            live on;
            push rtmp://xxx/xxx;
		}
    }
}

静态回源

通过pull配置可以将远端特定服务器上的流拉取到此服务器上。pull操作支持http-flv回源,只需将pull后的源地址换成http-flv地址即可。

rtmp {
    server {
        listen 1935;
        application live {
            live on;
            pull rtmp://xxx/xxx;
		}
    }
}

动态转推和动态回源

关于动态转推和动态回源这里引用AlexWoo项目中的说明文档。
在开始之前先描述一下动态回源和转推的原理,简单来说之所以称作“动态”是因为回源地址和转推地址不是固定的(可以动态变化),为了实现动态变化的效果,需要借助一个调度服务器,这个调度服务器的作用就是提供http接口返回目标服务器的回源地址或者转推地址(通过http 302 返回目标地址,目标地址保存在location字段里)。有了这样一个调度服务,我们就可以通过改变调度服务返回的目标地址字段来达到控制nginx-rtmp服务器回源和转推功能。
动态回源和动态转推是通过ngx_rtmp_oclp_module模块实现的。

ngx_rtmp_oclp_module


简介

ngx_rtmp_oclp_module 是 nginx rtmp 的能力开放模块,对外提供相应的通知或控制能力,用于替代 ngx_rtmp_notify_module。
这个模块会在rtmp或者http-flv推拉流的不同阶段向你配置文件里指定的url地址发送http get请求(控制事件),同时服务器会根据http返回结果做出相应的动作。

控制事件包含:

  • proc:进程启动时通知,只支持 start 触发点
  • play:有播放端接入时通知
  • publish:有推流端接入时通知
  • pull:触发回源拉流事件控制
  • push:触发转推事件控制
  • stream:流创建通知
  • meta:收到音视频头通知
  • record(还未支持):启动录制通知

控制事件触发点包含:

  • start:事件发生时触发,配置或不配置 start 均为默认开启状态
  • update:事件持续过程中的心跳刷新
  • done:事件结束时触发

扩展参数

  • args:向外发送通知或控制请求时,携带的 http 请求参数
  • groupid:分组,主要针对 push 或 meta,多路转推时,用于标识每路转推用
  • stage:触发阶段,可选 start,update 和 done
  • timeout:向外发送通知或控制请求时,等待外部响应的超时时间,默认为 3s
  • update:发送 update 通知的时间间隔,默认为 1min,只有 stage 配置了 update 才生效
基本模型

在这里插入图片描述

  • 当有拉流时,触发 play 通知,当拉流持续时,每隔一定时间间隔向外发送 update 通知,当拉流结束时发送 done 通知
  • 当有推流时,触发 publish 通知,当推流持续时,每隔一定时间间隔向外发送 update 通知,当推流结束时发送 done 通知
  • 当有一路拉流或一路推流时,触发 stream 通知,当流还继续存在时,每隔一定时间间隔向外发送 update 通知,所有推流和拉流都结束时发送 done 通知
拉流模型

在这里插入图片描述

  • 当有拉流时,触发 play 通知,当拉流持续时,每隔一定时间间隔向外发送 update 通知,当拉流结束时发送 done 通知
  • 当需要回源拉流时,触发 pull 控制,回源拉流创建成功后,每隔一定时间间隔向外发送 update 通知,当拉流结束时发送 done 通知
  • 当有拉流时,触发 stream 通知,当流还继续存在时,每隔一定时间间隔向外发送 update 通知,所有拉流都结束时发送 done 通知
推流模型

在这里插入图片描述

  • 当有推流时,触发 publish 通知,当推流持续时,每隔一定时间间隔向外发送 update 通知,当推流结束时发送 done 通知
  • 当需要转推流时,触发 push 控制,转推流创建成功后,每隔一定时间间隔向外发送 update 通知,当转推流结束时发送 done 通知
  • 当有推流时,触发 stream 通知,当流还继续存在时,每隔一定时间间隔向外发送 update 通知,推流结束时发送 done 通知

meta 的行为和 push 一致,只是 meta 的触发点在收到音视频头,push 触发点是收到 publish 命令,push 和 meta 是互斥的,配置了 push,meta 将不生效

示例

基本模型

application test {
    live on;
    cache_time 3s;
    idle_streams off;
    oclp_publish http://127.0.0.1:6200/oclp/v1/publish stage=start,done args=a=c&b=d;
    oclp_play    http://127.0.0.1:6200/oclp/v1/play    stage=start,done args=a=c&b=d;
    oclp_stream  http://127.0.0.1:6200/oclp/v1/stream  stage=start,done args=a=c&b=d;
}

拉流模型

application edge {
    live on;
    cache_time 3s;
    low_latency on;
    oclp_pull     http://127.0.0.1:6200/oclp/v1/pull    stage=start,update,done args=a=c&b=d;
    pull http://101.200.241.232:11939/core app=core;
}

推流模型

application pub {
    live on;
    #oclp_push    http://127.0.0.1:6200/oclp/v1/push    stage=start,update,done args=a=c&b=d timeout=1s;
    oclp_meta    http://127.0.0.1:6200/oclp/v1/push    stage=start,update,done args=a=c&b=d timeout=1s;
}

配置

oclp_proc
Syntax: oclp_proc url [timeout=time] [update=time];
Default: -
Context: rtmp

进程启动时,向配置的 url 发送 http get 请求,通知时会携带 call=init_process&worker_id=$ngx_worker 参数。

oclp_play
Syntax: oclp_play url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
Default: -
Context: application

只能配置一条

外部拉流时,向配置的 url 发送 http get 请求,通知时会携带

call=play&act=start&domain=$domain&app=$app&name=$name

如果配置了 args,会将 args 追加到默认参数后面

如果配置了 done,拉流结束后会发送 done 通知,和初始通知区别是,act=done

如果配置了 update,拉流结束前,每隔 update 时间间隔会发送一条刷新通知,和初始通知区别是,act=update

对于初始请求,如果外部异常,将不会发送 update 请求;如果外部回送非 200 响应,将会使用 403/NetStream.Play.Forbidden 断掉拉流请求;如果外部回送 200 响应并配置了刷新,会启动 update 定时器发送刷新通知

对于刷新通知和结束通知,不对响应做处理

oclp_publish
Syntax: oclp_publish url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
Default: -
Context: application

只能配置一条

外部推流时,向配置的 url 发送 http get 请求,通知时会携带

call=publish&act=start&domain=$domain&app=$app&name=$name

如果配置了 args,会将 args 追加到默认参数后面

如果配置了 done,推流结束后会发送 done 通知,和初始通知区别是,act=done

如果配置了 update,推流结束前,每隔 update 时间间隔会发送一条刷新通知,和初始通知区别是,act=update

对于初始请求,如果外部异常,将不会发送 update 请求;如果外部回送非 200 响应,将会使用 403/NetStream.Play.Forbidden 断掉拉流请求;如果外部回送 200 响应并配置了刷新,会启动 update 定时器发送刷新通知

对于刷新通知和结束通知,不对响应做处理

oclp_stream
Syntax: oclp_stream url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
Default: -
Context: application

只能配置一条

流创建时(有一路推流或一路拉流时),向配置的 url 发送 http get 请求,通知时会携带

call=stream&act=start&domain=$domain&app=$app&name=$name

如果配置了 args,会将 args 追加到默认参数后面

如果配置了 done,所有推拉流结束后会发送 done 通知,和初始通知区别是,act=done

如果配置了 update,所有推拉流结束前,每隔 update 时间间隔会发送一条刷新通知,和初始通知区别是,act=update

对于初始请求,如果外部异常或外部回送非 200 响应,将不会发送 update 请求;如果外部回送 200 响应并配置了刷新,会启动 update 定时器发送刷新通知

对于刷新通知和结束通知,不对响应做处理

oclp_pull
Syntax: oclp_pull url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
Default: -
Context: application

只能配置一条

需要触发回源拉流时,向配置的 url 发送 http get 请求,通知时会携带

call=pull&act=start&domain=$domain&app=$app&name=$name

如果配置了 args,会将 args 追加到默认参数后面。
如果配置了 done,relay pull session 结束后会发送 done 通知,和初始通知区别是,act=done
如果配置了 update,relay pull session 结束前,每隔 update 时间间隔会发送一条刷新通知,和初始通知区别是,act=update
对于初始请求,如果外部异常,将会启动 pull reconnect;如果外部回送 200 响应,将不会创建 relay pull session,因此后续不会有 update 和 done 通知;如果外部回送 4XX 或 5XX 响应,将会结束所有拉流请求。
如果回送 3XX 响应,将会根据 Location 头构造回源请求,Location 必须是完整的 rtmp 或 http url,如 rtmp://ip/app/name[?args],如果是 rtmp url 将会使用 rtmp 协议回源,如果是 http url 将会使用 http flv 协议回源。如果 3XX 响应中携带 Domain 头,将会使用该头构造 rtmp 的tc_url 或 http 的 Host 头

对于刷新通知和结束通知,不对响应做处理

oclp_push
Syntax: oclp_push url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
Default: -
Context: application

最多支持配置 8 条,每条对应一个 relay push session

需要触发流转推时,向配置的 url 发送 http get 请求,通知时会携带

call=push&act=start&domain=$domain&app=$app&name=$name

如果配置了 args,会将 args 追加到默认参数后面

如果配置了 done,每条 relay push session 结束后会发送 done 通知,和初始通知区别是,act=done

如果配置了 update,relay push session 结束前,每隔 update 时间间隔会发送一条刷新通知,和初始通知区别是,act=update

对于初始请求,如果外部异常,将会启动 push reconnect;如果外部回送 200 响应,将不会创建 relay push session,因此后续不会有 update 和 done 通知;如果外部回送 4XX 或 5XX 响应,将会结束推流请求

如果回送 3XX 响应,将会根据 Location 头构造回源请求,Location 必须是完整的 rtmp url,如 rtmp://ip/app/name[?args]。如果 3XX 响应中携带 Domain 头,将会使用该头构造 rtmp 的 tc_url

对于刷新通知和结束通知,不对响应做处理

oclp_meta
Syntax: oclp_meta url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
Default: -
Context: application

最多支持配置 8 条,每条对应一个 relay push session

基本功能与 oclp_push 相同,只不过 oclp_push 是 publish 命令触发,oclp_meta 是音视频头触发,具体触发规则见 oclp_meta_type 和 oclp_meta_once

oclp_meta_once
Syntax: oclp_meta_once on|off;
Default: on
Context: rtmp, server, application

oclp_meta 通知是否只触发一次

oclp_meta_type
Syntax: oclp_meta_once video|audio|both;
Default: video
Context: rtmp, server, application
  • video:oclp_meta 只有在收到视频头时触发
  • audio:oclp_meta 只有在收到音频头时触发
  • both:oclp_meta 在收到音频或视频头时均会触发

QQ交流群:697773082

Kafka分布式流媒体平台简介 流媒体平台有三个关键功能: 发布和订阅记录流,类似于消息队列或企业消息传递系统。 以容错的持久方式存储记录流。 记录发生时处理流。 Kafka通常用于两大类应用: 构建可在系统或应用程序之间可靠获取数据的实时流数据管道。 构建换或响应数据流的实时流应用程序。 要了解Kafka如何做这些事情,让我们深入探讨Kafka的能力。 首先是几个概念: Kafka作为一个集群运行在一个或多个可跨多... 阅读详情

相关推荐

基于EasyCVR平台的流媒体集群技术搭建及使用方法

传统上,单台流媒体服务器可以满足用户量较小的情况下的需求,但随着用户数量的迅速增加和用户区域的扩大,单台服务器的服务能力已经无法应对大规模并发请求的压力。每台服务器都具备独立的计算能力和存储能力,在负载均衡算法的控制下,将用户请求分配到最合适的服务器进行处理,从而有效提升视频直播和点播服务的容量和性能。在设备管理添加设备的时候,也可以指定添加的设备到哪个服务器流媒体集群方案通过数据库将不同的服务器数据库绑定在一起,它们彼此共用一个数据库,在不同的平台都可访问其它平台的数据,一切数据都是共享的。

EasyDarwin开源社区技术博客 368

Nginx+RTMP 拉流集群方案

基于Nginx+RTMP 配置拉流服务器,以及设置调功能

nginx实现一个直播服务—RTMP流和HTTP-FLV拉流

这篇文章主要记录用nginx实现直播服务,通过RTMP流和通过HTTP-FLV或RTMP拉流,并在页面中播放。

听海归雪的博客 1万+

Nginx+RTMP集群解决方案

Nginx+RTMP 直播服务器集群解决方案,包含直播服务器搭建、直播服务器集群RTMP 调、3.3 录制结束

linux流媒体集群,流媒体服务器nginxRTMP集成FFmpeg

1 理论知识1.1 RTMP的简介RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括...

weixin_28972031的博客 1383

基于Darwin实现分布式流媒体直播服务器系统

各位EasyDarwin开项目的爱好者,您好,这篇博客的年限有点老了,目前EasyDarwin已经采用全新的云平台架构,详细可以参考博客:http://blog.csdn.net/xiejiashu/article/details/51581003,您也可以直接访问EasyDarwin开项目的官网:www.easydarwin.org,获取最新EasyDarwin项目信息;系统功能介绍:系...

weixin_30800987的博客 442

403 forbidden nginx_分布式直播系统)【nginx-rtmp流媒体直播服务器单集群实现方式】...

载请注明出处:https://blog.csdn.net/impingo项目地址:https://github.com/im-pingo/nginx-rtmp-module关键词调度服务器:调度服务器是一个http接口服务器,它用来记录一路直播流在哪台服务器上发布,并且提供http接口用来查询流对应的服务器地址。:假设当前有两台服务器A和B,服务器A上存在某条流S,此时有播放端向服务器B请求...

weixin_39948442的博客 407

个人学习过程中,收集总结全网的流媒体-----持续更新!!!!

个人学习过程中,收集总结全网的流媒体-----持续更新!!!!流媒体直播ffmpegflvMSEWebRTChlsJavaCVrtmprtspvideonginx-rtmp-modulenginx-http-flv-module GIT地址: 流媒体全网资总结 流媒体 直播 如何降低直播延时 直播延时讲解 直播支持https连接 直播系统开发过程中,如何选择流媒体协议? 如何将安防摄像头接入互联网直播服务器 ffmpeg CentOS7安装ffmpeg ffmpeg架构 ffmpeg

爱是与世界平行 1379

用Darwin开发分布式流媒体服务器

我介绍的是如何在DSS的基础上进行改造,分别开发成为分布式流媒体系统中的设备接入服务(设备主动注册上线)与流媒体分发服务。大家肯定会奇怪,DSS怎么改造成设备接入服务呢,其实,以DSS的架构,完全可以改造成大部分类型的服务器系统,而且流媒体服务只是DSS的几个功能模块,其强大之处在于其整体框架与架构设计上,闲话少说,让我们直入主题: 设备接入服务:在大...

weixin_30279315的博客 271

nginx + rtmp 集群搭建时遇到的一个坑

使用nginx rtmp module的push功能搭建集群,即服务器A(origin)接受流,在application里配置push,送到另外的几台服务器(edge),届时观看直播通过另外的几台服务器观看。结果在本地测试没有问题,放到客户方服务器上测试,流正常,edge服务器也能收到流,stat页面能看到有数据进入,然而却无法播放edge上的rtmp流,hls切片有了,也能播放hls流。百...

流萤的专栏 3534

基于nginx-rtmp-module模块的relay功能分析及完善

多种实时流请求触发中继的实现基于nginx-1.8.1+nginx-rtmp-module方案1.概述²  视频直播方案基于nginx+rtmp;²  集群内区分边缘和务服器,边缘与是基于rtmp流做同步的,有relay模块实现;²  集群服务器除提供rtmp实时流基础功能外,基于rtmp实时流,还提供了httplive stream(hls)实时流及http live flv(hlf)实时...

回报社会的专栏 4218

使用nginx搭建rtmp+http_flv服务器实现直播

项目中要实现安卓手机上的直播功能,因为涉及网络安全,不允许使用第三方的直播服务器,所以需要自建一台直播流的视频服务器,将搭建过程记录如下。

shuaijie506的专栏 8609

FMS流媒体服务器集群

1.1         部署集群服务器 负载均衡设备不是基础网络设备,而是一种性能优化设备。首先,单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返给用户,系统处理能力得到大幅度提高,这就是我们常说的集群(clustering)技术。第二层

wdspringrain的专栏 5143

使用nginx部署rtmp流媒体服务器完成直播

nginx搭建rtmp流媒体服务器

qq_38580583的博客 4674

Java流媒体服务器开发实战指南

流媒体技术允许实时播放音频和视频内容,无需完全下载文件。这极大地优化了用户体验,通过连续的流式传输数据,用户能够在数据传输的过程中就开始播放媒体文件。Java作为多用途的编程语言,提供了强大的网络编程支持和丰富的多媒体处理库,使其成为实现流媒体应用的理想选择。Java多媒体框架(JMF)为Java程序提供了操作音频、视频和多媒体数据的功能。它遵循了Java的可移植性和跨平台性特点,并允许开发者以统一的方式处理各种多媒体内容。JMF的体系结构被设计为模块化,使得它能够轻松集成和扩展。核心组件包括。

weixin_42599908的博客 640

详解srs流媒体服务器集群

SRS集群通过Forward和Edge两种模式实现直播流分发。Forward模式下,Master节点主动送流至Slave节点,适合小型集群但存在带宽浪费问题;Edge模式采用"站+拉边缘"架构,边缘节点按需拉流,降低带宽压力,适用于大型分布式场景。两种模式均支持负载均衡和容灾,但Edge模式通过缓存机制优化资利用率,更适合高并发场景。配置时需区分站与边缘节点角色,并针对性调整RTMP/HTTP参数。

m0_73359068的博客 1401

Nginx直播服务器搭建及拉流测试

方便后面进行直播项目的实战练习,本文实现在 linux 下搭建 Nginx 直播服务器流器:FFmpeg Windows直播服务器Nginx+Rtmp Ubuntu播放器:VLC。

明天你好的博客 4040

SRS流媒体服务器——Edge集群搭建

SRS流媒体服务器——Edge集群搭建 目录 edge原理 dege配置 1. edge原理 SRS的Edge主要解决⼏条流有⼤量播放请求的场景,⽐如⼀个流有上万⼈观看。 SRS的Edge能对接所有的标准RTMP服务器。 Edge⼀般负载⾼,SRS⽀持的并发⾜够跑满千兆⽹带宽了。 Edge的主要应⽤场景: CDN/VDN⼤规模集群,客户众多流众多需要按需。 ⼩规模集群,但是流⽐较多,需要按需。 ⻣⼲带宽低,边缘服务器强悍,可以使⽤多层edge,降低上层BGP带宽。

努力努力再努力L 3648

nginx-rtmp服务器搭建

采用` nginx/1.18.0`和`nginx-rtmp-module`模块代码搭建`RTMP`流媒体服务器

qq_43424630的博客 1796
上一篇: 分布式直播系统(三)【Nginx-rtmp rtmp、http-flv、http-ts、hls、hls+ 配置说明】
下一篇: 分布式直播系统(五)【nginx-rtmp多进程模式下拉流失败的问题(进程间回源)】
im-pingo
博客等级 码龄7年 304粉丝 45原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值