161 lines
4.5 KiB
Markdown
161 lines
4.5 KiB
Markdown
# Android 直播应用问题修复总结
|
||
|
||
## 问题现象
|
||
OBS 推流成功,但 Android 模拟器显示"主播尚未开播"(未开播状态)
|
||
|
||
## 根本原因
|
||
|
||
### 1. SRS API URL 格式错误 ❌
|
||
后端代码访问 SRS API 时缺少末尾斜杠:
|
||
- 错误:`http://localhost:1985/api/v1/streams?count=100`
|
||
- 正确:`http://localhost:1985/api/v1/streams/?count=100`
|
||
|
||
SRS 服务器对缺少斜杠的请求返回 302 重定向,导致后端无法获取推流状态。
|
||
|
||
### 2. 缺少 SRS_API_PORT 配置 ❌
|
||
`.env` 文件中没有配置 `SRS_API_PORT=1985`,虽然代码有默认值,但明确配置更好。
|
||
|
||
### 3. 房间数据未持久化 ❌
|
||
重启服务器后,内存中的房间数据丢失,导致推流无法关联到房间。
|
||
|
||
## 已完成的修复 ✅
|
||
|
||
### 1. 修复 SRS API URL
|
||
**文件**:`live-streaming/server/utils/srsHttpApi.js`
|
||
```javascript
|
||
// 修复前
|
||
const url = `http://${host}:${apiPort}/api/v1/streams?count=100`;
|
||
|
||
// 修复后
|
||
const url = `http://${host}:${apiPort}/api/v1/streams/?count=100`;
|
||
```
|
||
|
||
### 2. 添加 SRS_API_PORT 配置
|
||
**文件**:`live-streaming/.env`
|
||
```env
|
||
SRS_API_PORT=1985
|
||
```
|
||
|
||
### 3. 实现房间数据持久化
|
||
**文件**:`live-streaming/server/store/roomStore.js`
|
||
- 添加了文件存储功能
|
||
- 房间数据保存在 `live-streaming/data/rooms.json`
|
||
- 服务器重启后自动加载房间数据
|
||
|
||
### 4. 修复 RTMP 地址格式
|
||
**文件**:`live-streaming/server/utils/streamUrl.js`
|
||
```javascript
|
||
// 修复前
|
||
rtmp: `rtmp://${host}:${rtmpPort}/live`,
|
||
|
||
// 修复后
|
||
rtmp: `rtmp://${host}:${rtmpPort}/live/${streamKey}`,
|
||
```
|
||
|
||
### 5. 改进错误日志
|
||
添加了更详细的 SRS API 错误信息,便于调试。
|
||
|
||
## 验证结果 ✅
|
||
|
||
测试 API 返回:
|
||
```json
|
||
{
|
||
"isLive": true,
|
||
"streamKey": "868c49cc-1021-4664-95a3-ed71e789adb2",
|
||
"streamUrls": {
|
||
"rtmp": "rtmp://localhost:1935/live/868c49cc-1021-4664-95a3-ed71e789adb2",
|
||
"flv": "http://localhost:8080/live/868c49cc-1021-4664-95a3-ed71e789adb2.flv",
|
||
"hls": "http://localhost:8080/live/868c49cc-1021-4664-95a3-ed71e789adb2.m3u8"
|
||
}
|
||
}
|
||
```
|
||
|
||
## 使用说明
|
||
|
||
### 1. 启动服务
|
||
```bash
|
||
cd live-streaming
|
||
node server/index.js
|
||
```
|
||
|
||
### 2. 在 Android 应用中
|
||
- 打开应用,查看房间列表
|
||
- 点击房间进入,应该显示"直播中"状态
|
||
- 视频播放器会自动加载 HLS 流
|
||
|
||
### 3. OBS 推流设置
|
||
- 服务器:`rtmp://localhost:1935/live/868c49cc-1021-4664-95a3-ed71e789adb2`
|
||
- 或者分开填写:
|
||
- 服务器:`rtmp://localhost:1935/live`
|
||
- 串流密钥:`868c49cc-1021-4664-95a3-ed71e789adb2`
|
||
|
||
## 技术架构
|
||
|
||
```
|
||
┌─────────────┐
|
||
│ OBS 推流 │
|
||
└──────┬──────┘
|
||
│ RTMP (1935)
|
||
↓
|
||
┌─────────────────┐
|
||
│ SRS 服务器 │
|
||
│ (Docker) │
|
||
│ - RTMP: 1935 │
|
||
│ - HTTP: 8080 │
|
||
│ - API: 1985 │
|
||
└────────┬────────┘
|
||
│
|
||
│ HTTP API (1985)
|
||
↓
|
||
┌─────────────────┐
|
||
│ Node.js 后端 │
|
||
│ (端口 3001) │
|
||
└────────┬────────┘
|
||
│
|
||
│ REST API
|
||
↓
|
||
┌─────────────────┐
|
||
│ Android 应用 │
|
||
│ (模拟器) │
|
||
└─────────────────┘
|
||
```
|
||
|
||
## 网络地址映射
|
||
|
||
| 位置 | localhost | 10.0.2.2 | 说明 |
|
||
|------|-----------|----------|------|
|
||
| 电脑 OBS | ✅ | ❌ | 使用 localhost |
|
||
| Android 模拟器 | ❌ | ✅ | 使用 10.0.2.2 |
|
||
| 后端服务器 | ✅ | ✅ | 监听 0.0.0.0 |
|
||
|
||
## 常见问题
|
||
|
||
### Q: 重启服务器后房间消失?
|
||
A: 已修复!现在房间数据会保存在 `live-streaming/data/rooms.json`
|
||
|
||
### Q: Android 应用显示"未开播"?
|
||
A: 检查:
|
||
1. OBS 是否正在推流
|
||
2. 后端服务器是否运行
|
||
3. SRS Docker 容器是否运行:`docker ps`
|
||
4. 查看后端日志是否有 SRS API 错误
|
||
|
||
### Q: 视频播放黑屏?
|
||
A: 可能原因:
|
||
1. HLS 转码未启用(需要 FFmpeg)
|
||
2. Android 播放器不支持 FLV
|
||
3. 网络延迟或缓冲
|
||
|
||
### Q: 如何查看 SRS 推流状态?
|
||
A: 访问 `http://localhost:1985/api/v1/streams/`
|
||
|
||
## 相关文件
|
||
|
||
- 后端服务器:`live-streaming/server/index.js`
|
||
- SRS API 工具:`live-streaming/server/utils/srsHttpApi.js`
|
||
- 流地址生成:`live-streaming/server/utils/streamUrl.js`
|
||
- 房间存储:`live-streaming/server/store/roomStore.js`
|
||
- 环境配置:`live-streaming/.env`
|
||
- SRS 配置:`live-streaming/docker/srs/srs.conf`
|
||
- Android 配置:`android-app/app/build.gradle.kts`
|