# RtmpDiscovery
一个可动态拓展的nginx rtmp流发现服务
## 具体功能
部署完毕后,可以动态注册nginx rtmp 服务器,并将服务器信息发布到指定的redis上
## 遇到的问题及解决方案
- 第一个遇到的问题是如何获取摄像头的视频流。
- 后面发现可以通过nginx搭建一个推流服务器。
- 第二个遇到的问题的如何处理摄像头的上线和下线。
- 刚开始是想让java后端和python算法后端都轮询nginx服务器,但是这样要维护两套轮询逻辑,而且对服务器压力较大。
- 于是我统一封装了轮询系统,即发现服务。发现服务来轮询摄像头状态,然后通过发布订阅来发布到redis服务器,之后两种后端只要订阅即可。
- 第三个遇到的问题是单个服务器带宽较小。
- 想法是通过部署多台推流服务器来分流。但是现有的技术好像比较难以实现对大带宽流量的分流。如nginx的负载均衡,实际上所有的流量都要经过负载均衡的服务器,适合对cpu压力大的场景。而其他的如LVS的TUN模式又要有硬件的支持。
- 之后想到转发rtmp协议,但是实现后发现只有打了补丁的rtmp客户端才能识别302转发,而一般的客户端都不支持。
- 最后我的实现方法是在每一台推流服务器上额外部署一个自己编写的服务,来将实际的服务器ip发布到redis,之后发现服务通过redis中的ip来发现服务器,之后在通过发现的服务器去发现在线的设备。而redis中的服务器地址都是真实的ip,然后设备再通过DNS来解析到不同ip来实现注册到不同的分流服务器上。
## 组件图
![](https://www.writebug.com/myres/static/uploads/2022/6/12/265d57d476b2bfc97fb486f09b1b5256.writebug)
## 配置图
![](https://www.writebug.com/myres/static/uploads/2022/6/12/8b49fb391ccdf85843cc85ea37d570c3.writebug)
## 实现思路
### 概述
通过Rtmp推流发现服务客户端(rtmpDiscoveryClient)将nginx rtmp服务器的ip设置到redis中。之后Rtmp推流发现服务服务端(rtmpDiscoveryService)从redis中获取所有在线的服务器ip,通过这些ip去对应的nginx服务器轮询其rtmp流的信息。每次轮询都会将新获取到的信息与redis中已发布的信息对比,如果不相同就将*服务器变更*的信息发布到redis的channel中。
### RtmpDiscoveryClient
client端首先要通过一个外网服务器来获取本机的公网ip,获取到ip之后,每过一段时间(默认是3s)就给redis服务器设置一个键值对,键值对也会在一段时间后过期(默认是9s)。如果服务端在键值对过期前没有重新设置(在这里就是连续三次没有设置存活),redis中的键值对就过期,service认为其下线。
### RtmpDiscoveryService
service每次轮询首先从redis中获取所有在线服务器ip,之后一一访问约定的获取rtmp流信息的地址获取对应服务器上的流信息。最后整合,与redis之前存在的rtmp流信息对比,如果相同就略过,如果出现差异,就更新,并且发布订阅消息,通知所有订阅的客户端。
## 部署方式
client客户端要和nginx部署在同一设备上,然后获取ip的地址要改成对应service部署的地址
### Nginx服务器配置
```
http{
server{
listen 80;
server_name 127.0.0.1;
#开启rtmp模块中自带的
location /stat {
rtmp_stat all;
}
location /live{
#Cors配置
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
add_header 'Access-Control-Allow-Headers' 'Content-Type';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
alias /dev/shm/hls;
#自动生成index
autoindex on;
types {
application/dash+xml mpd;
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
add_header Cache-Control no-cache;
}
}
}
rtmp{
server{
listen 1953;
application rtmp{
live on;
}
application hls{
live on;
#启用hls
hls on;
#缓存地址
hls_path /dev/shm/hls/;
}
}
}
```
### RtmpDiscoveryClient配置
### 启动
直接通过java -jar启动即可
#### 自定义配置文件
```properties
# redis服务器中用来存储当前服务器ip的key前缀
rtmp.redis.ipKey=rtmp:ip:
# 获取当前服务器公网ip的地址,可以使用Service服务器的部署地址的/get_client_ip方法
rtmp.service.url=http://...
# 还要配置自己的redis
spring.redis.host=...
spring.redis.password=...
```
### RtmpDiscoveryService配置
### 启动
直接通过java -jar启动即可
#### 自定义配置文件
```properties
# 获取的所有rtmp推流服务信息存储在redis中的key
rtmp.redis.key=rtmp:device
# 在redis中发布服务器状态改变信息的channel
rtmp.redis.channel=deviceChannel
# 获取所有在线的服务器ip的key前缀,与client的rtmp.redis.ipKey对应
rtmp.redis.ipKey=rtmp:ip:*
# 还要配置自己的redis
spring.redis.host=...
spring.redis.password=...
```
### 示例
service服务器:http://121.43.147.139:8080/swagger
rtmp推流链接:`rtmp://121.43.147.139:1953/*` 或`rtmp://106.15.74.153:1953/*` 其中`*`为自定义的名称,作为设备名
两台rtmp推流服务器是通过上面的部署方式部署的,设备接入就可以在网页看到状态更新
## 应用的项目
项目地址:https://github.com/FZUSESPR21W/STOP-Project
### 项目网络拓扑图
![](https://www.writebug.com/myres/static/uploads/2022/6/12/deaf267d05a0e6c97cc977f6f5099757.writebug)
shejizuopin
- 粉丝: 1w+
- 资源: 1302
最新资源
- comsol SPP波导EIT,包含两个模型
- 光伏储能+三相并离网逆变切运行模型含笔记 包含Boost、Buck-boost双向DCDC、并网逆变器控制、离网逆变器控制4大控制部分 光伏+boost电路应用mppt 采用电导增量法实现光能最大
- 西门子200smart控制3轴伺服程序,plc程序结构条理清晰,层次分明,注释齐全 西门子触摸屏程序画面功能齐全,画面精美 有io图 电气原理图 参考本案例程序 可快速掌握西门子200sma
- COMSOL含裂缝地层流动和传热耦合,油藏数值模拟,COMSOL裂缝流动,包含注入井与生产井,考虑裂缝交叉
- c# winform上位机源代码 plc通讯基于modbus通讯协议 sql2008
- 椭圆印花机程序,PLC 触摸屏 伺服全是台达品牌,包括主站和从站程序,AS228T-A主机,界面好看 实际使用设备,功能全面,资料齐全
- 光伏储能+三相离网逆变 包含光伏Boost、Buck-boost双向DCDC、三相离网逆变三大部分,0.25s时刻负荷有5kW突增至105kW boost电路应用mppt, 采用电导增量法实现光能最
- 西门子屏sR40程序,污水厂,带图纸
- Comsol矢量光束设置
- 西门子s7200smartplc 昆仑通态触摸屏 锅炉程序 模拟量读取 运算 时间自动切 水泵一用一备故障自动切 自动时间段加热 时间段设定温度 电能读取 及算法 modbus通讯控制
- 信捷四轴机械手臂控制,信捷PLC控制,具有伺服通讯及伺服选择,示教器急停,设置单圈脉冲数等
- 三菱plc程序常用画圆,用两轴伺服,有公式定理解释帮助理解 新手学习好案例,学会了可以随便画圆
- 威纶通与台达M系列变频器通讯程序 ~ 可以通过触摸屏控制变频器正反转,运行停止,还能监视变频器的运行频率,输出频率,输出电压,输出电流以及转速 有做笔记,详细内容见笔记 EB8000、EB Pr
- 西门子PLC博途3种自动流程程序写法 本案例介绍3种不同的方法去写自动流程程序 第一种是用scl case语录,另外的两种使用梯形图的模式去写 使用此类方法去写,清晰明了,非常使用 并且针对程序
- 电动汽车VCU hil BMS hil硬件在环仿真 其中包含新能源电动汽车整车建模说明书, hil模型包含驾驶员模块,仪表模块,BCU整车控制器模块,MCU电机模块,TCU变速箱模块,减速器模块,BM
- STM32F407ZET6两种工程文件: 板卡1:原理图,PCB,主要功能有CAN通讯,RS485通讯,以太网通讯,232通讯,USB接口,音频处理WM8978,MPU6050,SRAM,EEROM
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈