一个完整的、生产就绪的流媒体服务器解决方案,基于微服务架构,支持 RTMP 推流、实时转码和流管理。项目已完全实现并通过全面测试。
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ OBS Studio │───▶│ RTMP Server │───▶│ Transcoder │
│ (推流客户端) │ │ (Node.js:1935) │ │ (Java+FFmpeg) │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Web Client │◀───│ Web API Server │◀───│ Media Files │
│ (HLS Player) │ │ (Spring Boot) │ │ (.m3u8, .ts) │
└─────────────────┘ └──────────────────┘ └─────────────────┘
- ✅ RTMP 服务器: Node.js 实现,支持 OBS Studio 推流
- ✅ Web API 服务器: Spring Boot REST API,完整的流管理
- ✅ 转码服务: Java + FFmpeg 集成,视频处理能力
- ✅ 容器化部署: Podman Compose 一键部署
- ✅ 自动化测试: 完整的端到端测试框架
- ✅ 生产就绪: 健康检查、监控、日志等
LiveMediaServer/
├── web-api/ # Spring Boot Web API 服务
│ ├── src/main/java/com/livemediaserver/
│ │ ├── LiveMediaServerApplication.java # 主应用程序
│ │ ├── controller/StreamController.java # REST API 控制器
│ │ ├── service/StreamService.java # 业务逻辑层
│ │ ├── model/Stream.java # 数据模型
│ │ └── repository/StreamRepository.java # 数据访问层
│ ├── src/main/resources/application.yml # 配置文件
│ └── pom.xml # Maven 依赖
│
├── rtmp-server/ # Node.js RTMP 服务器
│ ├── server.js # RTMP 服务器主文件
│ ├── package.json # Node.js 依赖
│ └── Containerfile # 容器构建文件
│
├── transcoder-service/ # Java 转码服务
│ ├── src/TranscoderService.java # 转码服务主类
│ ├── Containerfile # 容器构建文件
│ └── hls/ # HLS 输出目录
│
├── compose.dev.yml # Podman Compose 配置
├── test-live-media-server.sh # 基础服务测试脚本
├── test-streaming-workflow.sh # 流媒体工作流测试脚本
├── FINAL_PROJECT_STATUS.md # 项目完成状态报告
└── README.md # 项目说明文档
- RTMP 流接收: Node.js 服务器,支持 OBS Studio 等推流工具
- Web API 管理: Spring Boot REST API,完整的流管理功能
- 转码服务: Java + FFmpeg 集成,视频处理能力
- 数据库集成: H2 内存数据库,流元数据存储
- 容器化部署: Podman Compose 一键部署和管理
- 健康检查: 所有服务的健康状态监控
- 自动化测试: 端到端测试验证
- 微服务架构: 高内聚低耦合的模块化设计
- 生产就绪: 容器化、监控、日志等生产级特性
- 测试驱动: 完整的自动化测试框架
- 现代技术栈: Java 17, Spring Boot, Node.js, FFmpeg
| Component | Technology | Purpose |
|---|---|---|
| RTMP Server | Pure Java + TCP Sockets | 接收OBS推流 |
| Web API | Spring Boot 3.2 | REST API和流管理 |
| Database | H2 (dev) / PostgreSQL (prod) | 流元数据存储 |
| Transcoding | FFmpeg | RTMP到HLS转换 |
| 容器化 | Podman (Fedora原生) | 服务编排和部署 |
| 构建工具 | Maven + javac | 依赖管理和编译 |
| 多阶段构建 | Containerfile | 优化镜像大小和安全性 |
- Podman (Fedora自带,无需Docker)
- podman-compose (可选,用于简化部署)
- OBS Studio (用于测试推流)
- Java 17+ (OpenJDK recommended)
- Maven 3.8+ (for Spring Boot module)
- FFmpeg (for transcoding, optional)
- Fedora Linux (推荐,Podman 原生支持)
- Podman 和 podman-compose (通常已预装)
- FFmpeg (用于测试推流)
# 1. 进入项目目录
cd /home/thezfz/Advanced_Network_Programming/LiveMediaServer
# 2. 后台启动所有服务
podman-compose -f compose.dev.yml up -d
# 3. 等待服务启动 (约30秒)
sleep 30
# 4. 验证服务状态
./test-live-media-server.sh
运行测试脚本后,你应该看到:
🧪 Live Media Server 端到端测试
✅ Web API 健康检查... 通过
✅ 转码服务健康检查... 通过
✅ RTMP 服务器... 通过
🎉 Live Media Server 测试完成!
# 运行完整的流媒体工作流测试
./test-streaming-workflow.sh
点击展开开发模式说明
cd rtmp-server
javac -d bin src/com/example/rtmpserver/*.java
java -cp bin com.example.rtmpserver.Server
cd web-api-server
mvn spring-boot:run
- 在OBS中开始推流
- 检查API:
curl http://localhost:8080/api/streams - 查看两个终端的日志
# 构建镜像
./podman-deploy.sh build
# 启动服务
./podman-deploy.sh start
# 查看状态
./podman-deploy.sh status
# 查看日志
./podman-deploy.sh logs
# 停止服务
./podman-deploy.sh stop
# 重启服务
./podman-deploy.sh restart
# 清理所有资源
./podman-deploy.sh cleanup
# 构建并启动所有服务
podman-compose up --build -d
# 查看日志
podman-compose logs -f
# 停止服务
podman-compose down
# 创建网络
podman network create live-media-net
# 构建镜像
podman build -t live-media-server/rtmp-server ./rtmp-server/
podman build -t live-media-server/web-api-server ./web-api-server/
# 启动RTMP服务器
podman run -d --name rtmp-server --network live-media-net -p 1935:1935 live-media-server/rtmp-server
# 启动Web API服务器
podman run -d --name web-api-server --network live-media-net -p 8080:8080 \
-v ./media-data:/app/media:rw live-media-server/web-api-server
| 端点 | 方法 | 功能描述 |
|---|---|---|
/api/actuator/health |
GET | 应用健康检查 |
/api/streams |
GET | 获取所有活跃流 |
/api/streams/start |
POST | 开始新的流 |
/api/streams/stop |
POST | 停止指定流 |
/api/h2-console |
GET | 数据库管理控制台 |
| 端点 | 方法 | 功能描述 |
|---|---|---|
/health |
GET | 转码服务健康检查 |
| 协议 | 地址格式 | 功能描述 |
|---|---|---|
| RTMP | rtmp://localhost:1935/live/{stream_key} |
视频推流接入点 |
# 健康检查
curl http://localhost:8080/api/actuator/health
# 获取所有流
curl http://localhost:8080/api/streams
# 开始流
curl -X POST http://localhost:8080/api/streams/start \
-H "Content-Type: application/json" \
-d '{"streamKey": "my_stream", "clientIp": "127.0.0.1"}'
# 停止流
curl -X POST http://localhost:8080/api/streams/stop \
-H "Content-Type: application/json" \
-d '{"streamKey": "my_stream", "clientIp": "127.0.0.1"}'
The RTMP server runs on port 1935 by default. No additional configuration required.
Edit web-api-server/src/main/resources/application.yml:
livemediaserver:
rtmp:
host: localhost
port: 1935
media:
storage-path: ../media-data
transcoder:
enabled: true
ffmpeg-path: ffmpeg
# 1. 基础服务测试
./test-live-media-server.sh
# 2. 完整流媒体工作流测试
./test-streaming-workflow.sh
详细的功能验证步骤请参考:COMPREHENSIVE_VERIFICATION_GUIDE.md
包含以下验证项目:
- ✅ 环境准备和服务启动
- ✅ 基础服务健康检查
- ✅ Web API 功能测试
- ✅ RTMP 服务器测试
- ✅ 转码服务验证
- ✅ 端到端流媒体工作流
- ✅ 容器化部署验证
- ✅ 性能和稳定性测试
- 打开 OBS Studio
- 设置 -> 推流
- 服务: 自定义
- 服务器:
rtmp://localhost:1935/live - 推流密钥:
your_stream_key - 开始推流
- 验证:
curl http://localhost:8080/api/streams
Podman服务启动失败
# 检查Podman状态
podman --version
systemctl --user status podman
# 查看容器日志
./podman-deploy.sh logs
podman logs rtmp-server
podman logs web-api-server
端口冲突
# 检查端口占用
ss -tuln | grep -E "(1935|8080)"
# 停止冲突的服务
./podman-deploy.sh stop
镜像构建失败
# 清理并重新构建
./podman-deploy.sh cleanup
./podman-deploy.sh build
RTMP连接失败
- 确保RTMP服务器容器正在运行:
podman ps - 检查防火墙设置:
sudo firewall-cmd --list-ports - 验证OBS配置:
rtmp://localhost:1935/live
Web API无法访问
- 检查容器状态:
./podman-deploy.sh status - 验证端口映射:
podman port web-api-server - 测试健康检查:
curl http://localhost:8080/api/actuator/health
媒体文件无法访问
- 检查卷挂载:
podman inspect web-api-server | grep -A5 Mounts - 验证目录权限:
ls -la media-data/
# 查看详细日志
./podman-deploy.sh logs web-api-server
# 进入容器调试
podman exec -it web-api-server /bin/bash
# 检查容器内部状态
podman exec web-api-server curl localhost:8080/api/actuator/health
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- RTMP Specification: Adobe's Real-Time Messaging Protocol documentation
- Spring Boot: For providing an excellent web framework
- FFmpeg: For powerful media processing capabilities
- OBS Studio: For being an excellent testing client
For questions, issues, or contributions:
- Open an issue on GitHub
- Check the troubleshooting section above
- Review the API documentation
Built with ❤️ for learning advanced network programming and streaming technologies