Skip to content

一套完整的电视直播系统解决方案,适用于有线电视或IPTV的 RTP 实时音视频直播流分发

Notifications You must be signed in to change notification settings

conetree/live-multicast

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

电视视频播放服务系统

Spring Boot License Java

项目简介

本项目是一套完整的电视直播系统解决方案,适用于有线电视或IPTV专网环境下的 RTP 实时音视频直播流分发。系统支持组播(Multicast)和单播(Unicast)两种传输模式,通过动态签名机制提供安全的播放鉴权,实现对直播流的全生命周期管理。

核心特性

  • 视频播放服务 - 支持 RTP/UDP 实时音视频直播流分发
  • 码流调度 - 智能调度组播和单播流,优化带宽使用
  • 播放鉴权服务 - 基于 HMAC-SHA256 的动态签名机制
  • 组播/单播支持 - 统一接口,灵活选择传输模式
  • 心跳监控 - 实时会话监控,自动断开超时连接
  • 容灾与限流 - 完善的并发控制和服务容错机制
  • 运维管理 - 完整的审计日志、监控指标和告警系统

系统架构

整体架构图

graph TD
    A[客户端/播放器] -->|1. 请求播放授权| B[业务服务]
    B -->|2. 调用鉴权| C[鉴权服务]
    C -->|3. 验证用户权限| D[用户权限系统]
    C -->|4. 生成签名URL| B
    B -->|5. 返回签名URL| A

    A -->|6a. 组播模式| E[组播网络]
    A -->|6b. 单播模式| F[RTP流媒体服务器]

    F -->|7. 验证签名| C

    E -.->|流数据| A
    F -.->|流数据| A

    C -->|日志| G[审计日志系统]
Loading

核心组件

组件 职责 技术选型
业务服务 接收客户端请求,协调鉴权和流分发 Spring Boot REST API
鉴权服务 签名生成与验证、权限校验 Spring Boot Service
用户权限系统 用户身份验证、订阅权限管理 数据库/JWT/Redis
RTP流媒体服务器 单播流推送、会话管理 自研/SRS/Owncast
组播网络 组播流分发(网络层) IGMP/PIM
审计日志系统 记录所有鉴权和播放行为 ELK/日志文件

功能特性

1. 视频播放服务与码流调度

传输模式

  • 组播模式(Multicast)

    • 适用于广电内网、大规模直播场景
    • 带宽占用固定,与客户端数量无关
    • 基于 IGMP/PIM 协议的网络层分发
    • 支持动态组播地址和端口分配
  • 单播模式(Unicast)

    • 适用于互联网点播、小规模直播
    • 精确的会话管理和并发控制
    • 实时验证和动态推流
    • 支持动态端口和 SSRC 分配

智能调度

  • 根据网络状况和用户数量自动选择最优传输模式
  • 动态资源分配(端口、SSRC、组播地址)
  • 支持不同频道的混合部署

2. 视频播放鉴权服务

安全机制

  • 动态签名算法:基于 HMAC-SHA256 的签名机制
  • 时间窗控制:签名有效期 5 分钟,防止长期有效链接泄露
  • 防重放攻击:时间戳 + 可选 nonce 机制
  • 防盗链:可选绑定客户端 IP、设备指纹、Referer
  • 密钥管理:支持密钥轮换和多密钥过渡

鉴权流程

sequenceDiagram
    participant Client as 客户端
    participant Biz as 业务服务
    participant Auth as 鉴权服务
    participant Media as 流媒体服务

    Client->>Biz: 1. 发起播放请求
    Biz->>Auth: 2. 请求生成签名
    Auth->>Auth: 3. 校验权限并生成签名
    Auth-->>Biz: 4. 返回签名URL
    Biz-->>Client: 5. 返回播放地址
    Client->>Media: 6. 发起播放连接
    Media->>Auth: 7. 验证签名
    Auth-->>Media: 8. 验证结果
    Media-->>Client: 9. 推送流数据
Loading

API 接口

播放授权接口

POST /api/live/play/auth
Content-Type: application/json

{
  "userId": "u_12345678",
  "streamId": "live_chn_001",
  "mode": "multicast",
  "clientIp": "203.0.113.42",
  "deviceId": "001a2b3c4d5d"
}

响应示例

{
  "code": 200,
  "message": "success",
  "data": {
    "playUrl": "rtp://239.1.2.3:5004?ts=1737192000&userId=u_12345678&...",
    "mode": "multicast",
    "expireAt": 1737192300,
    "tokenTTL": 300
  }
}

3. 视频组播/单播管理

组播管理

  • 地址池管理:支持多个组播地址段配置
  • 动态分配:自动为频道分配可用的组播地址
  • 端口管理:可配置端口范围(5000-6000)
  • SSRC 管理:唯一的同步源标识符分配

单播管理

  • 会话创建:验证签名后创建 RTP 会话
  • 资源分配:动态分配端口和 SSRC
  • 会话跟踪:记录会话信息(用户、流、IP、端口、过期时间)
  • 并发控制
    • 单用户最大并发数限制
    • 全局最大并发数限制
    • 超限自动拒绝新连接

4. 视频心跳监控

会话保持

  • 心跳机制:客户端每 30 秒发送心跳包
  • 自动续期:每次心跳延长会话 10 分钟
  • 超时断开:超过 60 秒无心跳自动断开连接
  • 优雅关闭:支持客户端主动断开(RTSP TEARDOWN)

监控指标

实时监控

  • 当前活跃会话数
  • 各频道观看人数
  • 实时带宽使用情况
  • 鉴权成功率和失败率

性能指标

  • 鉴权请求 QPS
  • 平均响应时间
  • 签名计算耗时
  • 会话建立成功率

异常监控

  • 签名过期次数
  • IP 校验失败次数
  • 心跳超时次数
  • 并发超限次数

5. 服务容灾与限流,运维管理

容灾机制

  • 服务高可用

    • 支持多实例部署
    • 负载均衡(Nginx/LB)
    • Redis 集群支持
  • 故障自愈

    • 自动检测会话异常
    • 自动清理过期会话
    • 心跳超时自动断开
  • 数据备份

    • 审计日志持久化
    • 会话信息定期快照

限流策略

  • 接口限流:基于 IP 或用户的 QPS 限制
  • 并发限流:全局和单用户并发数限制
  • 带宽限流:根据系统带宽计算最大并发数
  • 熔断降级:异常情况下自动熔断保护

运维管理

审计日志

  • 记录所有鉴权请求和结果
  • 会话创建、关闭事件
  • 心跳记录
  • 异常和错误日志

监控与告警

  • Prometheus 指标暴露
  • Grafana 可视化仪表盘
  • 告警规则配置
    • 鉴权失败率 > 10%
    • 平均响应时间 > 100ms
    • 活跃会话数 > 阈值 90%

运维工具

  • 强制断开指定会话
  • 批量查询用户观看记录
  • 实时流量监控
  • 密钥轮换工具

技术栈

后端框架

  • Spring Boot 3.x/4.x - 应用框架
  • Spring Web - REST API
  • Spring Data - 数据访问
  • Spring Security - 安全框架(可选)

核心技术

  • HMAC-SHA256 - 签名算法
  • Apache Commons Codec - Base64 编码
  • Redis - 缓存和 nonce 防重放(可选)
  • SLF4J + Logback - 日志框架

监控运维

  • Prometheus - 指标采集
  • Grafana - 可视化监控
  • ELK Stack - 日志分析(可选)

RTP 支持

  • JLanRTP - Java RTP 库
  • 自研 UDP Socket - 自定义实现

快速开始

环境要求

  • JDK 17+
  • Maven 3.6+
  • Redis 6.0+(可选)
  • MySQL 8.0+(用户权限管理)

安装步骤

  1. 克隆项目
git clone https://github.com/conetree/live-multicast.git
cd live-multicast
  1. 配置文件

编辑 src/main/resources/application.yml

live:
  auth:
    # 密钥(生产环境使用环境变量)
    app-secret: ${APP_SECRET:your-secret-key}
    token-ttl: 300
    ip-binding-enabled: false
    nonce-enabled: false

  multicast:
    ip-pool:
      - 239.1.1.0/24
      - 239.1.2.0/24
    port-range: 5000-6000

  unicast:
    server-ip: 192.168.1.100
    port-range: 10000-20000
    max-sessions-per-user: 3
    max-total-sessions: 10000
  1. 构建项目
mvn clean package
  1. 运行服务
java -jar target/live-multicast-*.jar

测试接口

# 请求播放授权
curl -X POST http://localhost:8080/api/live/play/auth \
  -H "Content-Type: application/json" \
  -d '{
    "userId": "u_12345678",
    "streamId": "live_chn_001",
    "mode": "multicast",
    "clientIp": "203.0.113.42",
    "deviceId": "001a2b3c4d5d"
  }'

部署方案

单机部署

[Nginx] --> [Spring Boot App] --> [Redis]
                                --> [MySQL]

集群部署

                    --> [App Instance 1]
[Nginx] --> [LB] --> --> [App Instance 2] --> [Redis Cluster]
                    --> [App Instance 3] --> [MySQL Master/Slave]

Docker 部署

# 构建镜像
docker build -t live-multicast:latest .

# 运行容器
docker run -d \
  -p 8080:8080 \
  -e APP_SECRET=your-secret-key \
  -e SPRING_PROFILES_ACTIVE=prod \
  live-multicast:latest

项目结构

src/main/java/com/example/live/
├── Application.java                      # 应用启动类
│
├── interfaces/                           # 接口层
│   └── controller/
│       └── AuthController.java           # 鉴权控制器
│
├── application/                          # 应用层
│   ├── dto/auth/                        # 数据传输对象
│   └── service/
│       └── AuthApplicationService.java   # 鉴权应用服务
│
├── domain/                               # 领域层
│   ├── model/auth/                      # 认证领域模型
│   ├── model/session/                   # 会话领域模型
│   ├── service/                         # 领域服务
│   └── repository/                      # 仓储接口
│
└── infrastructure/                       # 基础设施层
    ├── config/                          # 配置
    ├── util/                            # 工具类
    ├── service/                         # 服务实现
    └── repository/                      # 仓储实现

安全说明

安全级别

本方案采用中等安全级别,平衡了安全性、性能与可维护性。

特性 实现方式
签名算法 HMAC-SHA256
重放防护 时间窗 5 分钟
IP 绑定 可选配置
设备绑定 强制要求
密钥管理 环境变量/KMS
验证位置 业务层 + 流媒体服务器

安全最佳实践

  1. 密钥管理

    • 使用环境变量或 KMS 存储密钥
    • 定期轮换密钥(建议 3-6 个月)
    • 禁止硬编码密钥
  2. 传输安全

    • 使用 HTTPS 传输鉴权请求
    • 考虑 SRTP 加密 RTP 流
  3. 监控告警

    • 实时监控异常鉴权行为
    • 设置告警阈值
    • 记录完整审计日志

性能指标

基准测试

  • 签名生成:< 1ms
  • 鉴权接口 QPS:> 10,000
  • 平均响应时间:< 50ms
  • 并发会话数:> 1,000

性能优化

  • 无数据库查询的签名验证
  • 内存会话管理
  • 可选 Redis 缓存
  • 连接池复用

路线图

已完成 ✅

  • 基础鉴权功能
  • 组播/单播支持
  • 会话管理
  • 心跳监控
  • 审计日志

进行中 🚧

  • nonce 防重放机制(Redis)
  • 设备指纹绑定
  • Prometheus 指标集成

计划中 📋

  • CDN 边缘鉴权
  • SRTP 加密支持
  • 国密算法支持(SM3/SM4)
  • 短期 Token 机制
  • Web 管理后台

文档


贡献

欢迎提交 Issue 和 Pull Request!

开发流程

  1. Fork 本仓库
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 开启 Pull Request

许可证

本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情


联系方式


致谢

感谢所有为本项目做出贡献的开发者!


注意:本项目仅供学习和研究使用,不得用于商业用途。

About

一套完整的电视直播系统解决方案,适用于有线电视或IPTV的 RTP 实时音视频直播流分发

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published