本项目是一套完整的电视直播系统解决方案,适用于有线电视或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[审计日志系统]
| 组件 | 职责 | 技术选型 |
|---|---|---|
| 业务服务 | 接收客户端请求,协调鉴权和流分发 | Spring Boot REST API |
| 鉴权服务 | 签名生成与验证、权限校验 | Spring Boot Service |
| 用户权限系统 | 用户身份验证、订阅权限管理 | 数据库/JWT/Redis |
| RTP流媒体服务器 | 单播流推送、会话管理 | 自研/SRS/Owncast |
| 组播网络 | 组播流分发(网络层) | IGMP/PIM |
| 审计日志系统 | 记录所有鉴权和播放行为 | ELK/日志文件 |
-
组播模式(Multicast)
- 适用于广电内网、大规模直播场景
- 带宽占用固定,与客户端数量无关
- 基于 IGMP/PIM 协议的网络层分发
- 支持动态组播地址和端口分配
-
单播模式(Unicast)
- 适用于互联网点播、小规模直播
- 精确的会话管理和并发控制
- 实时验证和动态推流
- 支持动态端口和 SSRC 分配
- 根据网络状况和用户数量自动选择最优传输模式
- 动态资源分配(端口、SSRC、组播地址)
- 支持不同频道的混合部署
- 动态签名算法:基于 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. 推送流数据
播放授权接口
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
}
}- 地址池管理:支持多个组播地址段配置
- 动态分配:自动为频道分配可用的组播地址
- 端口管理:可配置端口范围(5000-6000)
- SSRC 管理:唯一的同步源标识符分配
- 会话创建:验证签名后创建 RTP 会话
- 资源分配:动态分配端口和 SSRC
- 会话跟踪:记录会话信息(用户、流、IP、端口、过期时间)
- 并发控制
- 单用户最大并发数限制
- 全局最大并发数限制
- 超限自动拒绝新连接
- 心跳机制:客户端每 30 秒发送心跳包
- 自动续期:每次心跳延长会话 10 分钟
- 超时断开:超过 60 秒无心跳自动断开连接
- 优雅关闭:支持客户端主动断开(RTSP TEARDOWN)
实时监控
- 当前活跃会话数
- 各频道观看人数
- 实时带宽使用情况
- 鉴权成功率和失败率
性能指标
- 鉴权请求 QPS
- 平均响应时间
- 签名计算耗时
- 会话建立成功率
异常监控
- 签名过期次数
- IP 校验失败次数
- 心跳超时次数
- 并发超限次数
-
服务高可用
- 支持多实例部署
- 负载均衡(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 - 日志分析(可选)
- JLanRTP - Java RTP 库
- 自研 UDP Socket - 自定义实现
- JDK 17+
- Maven 3.6+
- Redis 6.0+(可选)
- MySQL 8.0+(用户权限管理)
- 克隆项目
git clone https://github.com/conetree/live-multicast.git
cd live-multicast- 配置文件
编辑 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- 构建项目
mvn clean package- 运行服务
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 build -t live-multicast:latest .
# 运行容器
docker run -d \
-p 8080:8080 \
-e APP_SECRET=your-secret-key \
-e SPRING_PROFILES_ACTIVE=prod \
live-multicast:latestsrc/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 |
| 验证位置 | 业务层 + 流媒体服务器 |
-
密钥管理
- 使用环境变量或 KMS 存储密钥
- 定期轮换密钥(建议 3-6 个月)
- 禁止硬编码密钥
-
传输安全
- 使用 HTTPS 传输鉴权请求
- 考虑 SRTP 加密 RTP 流
-
监控告警
- 实时监控异常鉴权行为
- 设置告警阈值
- 记录完整审计日志
- 签名生成:< 1ms
- 鉴权接口 QPS:> 10,000
- 平均响应时间:< 50ms
- 并发会话数:> 1,000
- 无数据库查询的签名验证
- 内存会话管理
- 可选 Redis 缓存
- 连接池复用
- 基础鉴权功能
- 组播/单播支持
- 会话管理
- 心跳监控
- 审计日志
- nonce 防重放机制(Redis)
- 设备指纹绑定
- Prometheus 指标集成
- CDN 边缘鉴权
- SRTP 加密支持
- 国密算法支持(SM3/SM4)
- 短期 Token 机制
- Web 管理后台
欢迎提交 Issue 和 Pull Request!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情
- 项目主页:https://github.com/conetree/live-multicast
- Issue 追踪:https://github.com/conetree/live-multicast/issues
- 邮件:jarryli@gmail.com
感谢所有为本项目做出贡献的开发者!
注意:本项目仅供学习和研究使用,不得用于商业用途。