# endless-streamlink **Repository Path**: endless22/endless-streamlink ## Basic Information - **Project Name**: endless-streamlink - **Description**: 视频云平台,支持onvif、国标接入,流媒体直播,录像存储,行业业务等。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 3 - **Created**: 2026-09-17 - **Last Updated**: 2026-10-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Endless Streamlink 面向多租户的视频接入与媒体云平台:把 GB28181、JT1078、ONVIF 等异构设备统一接入,对外提供实时预览、录像回放、统一告警和对象存储归档能力。单机 Docker Compose 即可完整运行,同一套代码按角色组合扩展为集群。 项目代号 Endless Streamlink,对应仓库 `endless-streamlink`;Maven 构建产物(`endless-streamlink-*`)、容器镜像、数据库(`endless_streamlink`)与 Redis 键统一使用该标识,不保留旧命名兼容层。 ## 应用场景 | 场景 | 平台提供的能力 | | --- | --- | | 多租户视频云运营 | 租户、IAM、统一资产与租户隔离;设备重新对账不改变已分配的租户归属 | | 异构设备统一接入 | GB28181(国标)、JT1078(车载)、ONVIF(IP 摄像机)接入后统一投影为平台资产 | | 低延迟实时预览 | WebRTC 优先,ZLMediaKit 负责接收与分发,Java 服务不转发音视频字节 | | 录像查询与回放 | 租户隔离的录像目录查询、回放会话启停,音视频由设备直连媒体服务 | | 统一告警闭环 | 设备报警经稳定事件契约进入平台,按资产归属隔离租户,支持确认、解决与不可变处理轨迹 | | 录像归档与内容分发 | 对象存储走 S3 能力契约(SeaweedFS 提供数据面),为后续 Record Worker 归档与 Content Gateway 读取建立基础 | ## 架构总览 ![Endless Streamlink 总体分层架构](docs/assets/endless/endless-layered-architecture.svg) - **SaaS 决定"用户要什么、是否有权限"**:业务规则、租户权限与产品体验,承载 IAM、设备资产、告警策略、预览、回放、录像计划与开放平台。 - **PaaS 决定"设备、媒体、录像和存储如何执行"**:协议接入、媒体调度与分发、录像归档、内容访问、对象存储、任务与事件。 - **IaaS 决定"能力运行在哪里"**:物理机或虚拟机、网络、负载均衡、磁盘与容器运行时。 - 分层按职责与依赖划分,不按语言或进程划分;SaaS 与 PaaS 只通过稳定契约和领域事件协作。 - PaaS 内部区分控制面与执行/数据面,控制器可合并部署,但职责、状态归属和扩容单元保持独立,不设置平台总 Master。 ## 代码结构 ```text app/server (组合根:启动、装配、跨域编排) ├──► modules/saas (租户、IAM、资产、告警) ├──► modules/paas (接入、媒体、录像、存储执行) └─────────┴──► contracts (端口、事件、DTO) modules/paas ──────► adapters/onvif-client app/web (Endless Streamlink Web 前端) deploy/ (数据库脚本、本地容器部署入口) ``` 依赖规则: - `contracts` 只依赖 Java 标准库,不引入 Spring、MyBatis、协议 SDK 或具体存储实现。 - `modules/saas` 与 `modules/paas` 均可依赖 `contracts`,二者禁止互相形成编译依赖。 - `app/server` 是唯一组合根,承载跨域流程编排;领域规则仍归属对应模块。 - PaaS 需要身份、租户等 SaaS 能力时必须依赖端口(如 `PushAuthorizationPort`),不得引用其服务实现。 - `adapters` 封装协议与外部系统客户端,现有协议运行时代码按端口逐个迁出,不做一次性重写。 状态归属:权威业务数据在 MySQL(SaaS 与 PaaS 使用独立 Schema 与表所有权),在线状态、会话路由与租约在 Redis,录像与其他对象字节以 S3 兼容存储为长期权威。 ## 已贯通的能力 1. **统一资产**:GB28181、JT1078、ONVIF 接入输出 `AccessAssetSnapshot`,由 `app/server` 对账编排并持久化为带租户归属的统一资产。 2. **统一告警**:GB28181 报警转换为 `AccessAlarmEvent`,幂等入库、租户路由与处理轨迹完整;未对账报警暂存系统租户,资产落定后自动修正归属。 3. **录像目录与设备回放**:`RecordingCatalogPort` 与 `RecordingPlaybackPort` 支撑 `/api/recordings` 的租户隔离查询与回放会话管理。 4. **对象存储**:`ObjectStoragePort` 定义流式写入、范围读取等稳定语义,本地由 SeaweedFS 提供 S3 数据面。 ## 快速开始 ```bash ./deploy/local/up.sh ``` 环境文件、生成目录、Compose 项目名和 GB28181 动态 RTP 端口段均可配置,详见 [本地部署](docs/local-deployment.md)。 ## 部署形态 ![Endless Streamlink 单机与集群部署](docs/assets/endless/endless-deployment-modes.svg) | 部署项 | 单机模式 | 集群模式 | | --- | --- | --- | | 应用角色 | SaaS、控制器、Worker 合并为 All-in-One | 按角色独立运行多副本 | | 媒体与内容访问 | ZLMediaKit × 1,内容访问可与 Nginx 合并 | ZLMediaKit × N、Content Gateway × N 独立扩容 | | 数据与协调 | MySQL × 1、Redis × 1、SeaweedFS 各组件 × 1(副本 000) | MySQL/Redis HA、Event Bus 与 Task Queue 集群、跨节点多副本 | | 可用性 | 功能完整,无硬件高可用,必须异机备份 | 同角色副本跨故障域,允许单节点退出 | 两种形态共用同一代码库、能力契约、数据结构和对象键规则,集群只改变角色组合、共享组件实现与副本数。 ## 文档 - [平台架构设计](docs/architecture.md):分层边界、PaaS 内部架构、状态归属与演进验收标准。 - [本地部署](docs/local-deployment.md):`./deploy/local/up.sh` 的配置项与运行说明。 - [ONVIF 接入](docs/onvif-access.md):ONVIF 设备接入与网络模式配置。 - [测试](docs/testing.md):测试分层与执行方式。 - [单机模式验证记录](docs/single-node-validation.md):本次实测结果、修复和未覆盖边界。 - [开源发布审计](docs/open-source-audit.md):私有数据核查结果、第三方制品许可问题与 Git 历史清理边界。