439 lines
10 KiB
Markdown
439 lines
10 KiB
Markdown
|
|
# 推流问题完整诊断与解决
|
|||
|
|
|
|||
|
|
## 🔍 当前状态
|
|||
|
|
|
|||
|
|
- ✅ 后端服务器运行正常(端口 3001)
|
|||
|
|
- ✅ SRS 服务器运行正常(端口 1935)
|
|||
|
|
- ✅ 直播间已创建(streamKey: 7f4acb94-f91c-4ec0-84eb-fbb1855f8f18)
|
|||
|
|
- ❌ **SRS 没有收到推流**(streams 数组为空)
|
|||
|
|
- ❌ **Android 应用显示"未开播"**
|
|||
|
|
|
|||
|
|
## 🎯 问题原因
|
|||
|
|
|
|||
|
|
**OBS 的推流没有成功到达 SRS 服务器!**
|
|||
|
|
|
|||
|
|
可能的原因:
|
|||
|
|
1. OBS 推流地址配置错误
|
|||
|
|
2. OBS 推流失败但没有提示
|
|||
|
|
3. OBS 没有真正开始推流
|
|||
|
|
4. 防火墙阻止了连接
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 完整诊断步骤
|
|||
|
|
|
|||
|
|
### 步骤 1:检查 OBS 推流状态
|
|||
|
|
|
|||
|
|
#### 1.1 查看 OBS 界面
|
|||
|
|
在 OBS 右下角查看:
|
|||
|
|
|
|||
|
|
**如果推流成功**:
|
|||
|
|
```
|
|||
|
|
直播中 | 00:01:23 | 2500 kb/s | 0 丢帧
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**如果推流失败**:
|
|||
|
|
```
|
|||
|
|
未推流
|
|||
|
|
```
|
|||
|
|
或显示红色错误提示
|
|||
|
|
|
|||
|
|
#### 1.2 查看 OBS 日志
|
|||
|
|
1. 点击 OBS 菜单栏:**帮助** → **日志文件** → **查看当前日志**
|
|||
|
|
2. 搜索 "error" 或 "failed"
|
|||
|
|
3. 查看是否有连接错误
|
|||
|
|
|
|||
|
|
### 步骤 2:验证 OBS 推流设置
|
|||
|
|
|
|||
|
|
#### 2.1 打开推流设置
|
|||
|
|
1. 点击 **"设置"** → **"推流"**
|
|||
|
|
2. 检查配置
|
|||
|
|
|
|||
|
|
#### 2.2 正确的配置应该是
|
|||
|
|
|
|||
|
|
**方式 A:完整地址**
|
|||
|
|
```
|
|||
|
|
服务: 自定义...
|
|||
|
|
服务器: rtmp://localhost:1935/live/7f4acb94-f91c-4ec0-84eb-fbb1855f8f18
|
|||
|
|
串流密钥: (留空)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**方式 B:分开填写**
|
|||
|
|
```
|
|||
|
|
服务: 自定义...
|
|||
|
|
服务器: rtmp://localhost:1935/live
|
|||
|
|
串流密钥: 7f4acb94-f91c-4ec0-84eb-fbb1855f8f18
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2.3 常见错误
|
|||
|
|
|
|||
|
|
❌ **错误 1**:使用了 `10.0.2.2`
|
|||
|
|
```
|
|||
|
|
服务器: rtmp://10.0.2.2:1935/live/... ← 错误!
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
❌ **错误 2**:streamKey 不完整
|
|||
|
|
```
|
|||
|
|
串流密钥: 7f4acb94-f91c-4ec0 ← 不完整!
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
❌ **错误 3**:多了空格或换行
|
|||
|
|
```
|
|||
|
|
服务器: rtmp://localhost:1935/live/7f4acb94-f91c-4ec0-84eb-fbb1855f8f18
|
|||
|
|
↑ 多了空格
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤 3:重新配置 OBS
|
|||
|
|
|
|||
|
|
#### 3.1 停止当前推流
|
|||
|
|
1. 如果 OBS 显示"直播中",点击 **"停止推流"**
|
|||
|
|
2. 等待完全停止
|
|||
|
|
|
|||
|
|
#### 3.2 清空并重新配置
|
|||
|
|
1. 点击 **"设置"** → **"推流"**
|
|||
|
|
2. **服务器** 框中,删除所有内容
|
|||
|
|
3. 重新输入(不要复制粘贴,手动输入):
|
|||
|
|
```
|
|||
|
|
rtmp://localhost:1935/live/7f4acb94-f91c-4ec0-84eb-fbb1855f8f18
|
|||
|
|
```
|
|||
|
|
4. **串流密钥**:确保为空
|
|||
|
|
5. 点击 **"应用"**
|
|||
|
|
6. 点击 **"确定"**
|
|||
|
|
|
|||
|
|
#### 3.3 测试连接(可选)
|
|||
|
|
有些 OBS 版本有"测试连接"按钮,如果有就点击测试。
|
|||
|
|
|
|||
|
|
### 步骤 4:开始推流并验证
|
|||
|
|
|
|||
|
|
#### 4.1 确保有视频源
|
|||
|
|
1. 在 OBS 的"来源"区域,确保至少有一个视频源
|
|||
|
|
2. 如果没有,添加一个:
|
|||
|
|
- 点击 + 号
|
|||
|
|
- 选择"视频捕获设备"(摄像头)或"显示器捕获"(屏幕)
|
|||
|
|
|
|||
|
|
#### 4.2 开始推流
|
|||
|
|
1. 点击 **"开始推流"** 按钮
|
|||
|
|
2. 观察状态栏变化
|
|||
|
|
|
|||
|
|
#### 4.3 立即验证(推流后 5 秒内)
|
|||
|
|
|
|||
|
|
**方法 1:浏览器检查 SRS**
|
|||
|
|
打开浏览器访问:
|
|||
|
|
```
|
|||
|
|
http://localhost:1985/api/v1/streams/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**成功时应该看到**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 0,
|
|||
|
|
"streams": [
|
|||
|
|
{
|
|||
|
|
"id": "vid-xxxxx",
|
|||
|
|
"name": "7f4acb94-f91c-4ec0-84eb-fbb1855f8f18",
|
|||
|
|
"app": "live",
|
|||
|
|
"publish": {
|
|||
|
|
"active": true,
|
|||
|
|
"cid": "xxxxx"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**失败时会看到**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 0,
|
|||
|
|
"streams": []
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**方法 2:检查后端 API**
|
|||
|
|
打开浏览器访问:
|
|||
|
|
```
|
|||
|
|
http://localhost:3001/api/rooms/7f4acb94-f91c-4ec0-84eb-fbb1855f8f18
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
查看 `isLive` 字段:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"isLive": true ← 应该是 true
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**方法 3:Android 应用**
|
|||
|
|
1. 在 Android 模拟器中下拉刷新
|
|||
|
|
2. 查看直播间状态是否变成"直播中"
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🐛 如果还是失败
|
|||
|
|
|
|||
|
|
### 诊断 A:检查防火墙
|
|||
|
|
|
|||
|
|
Windows 防火墙可能阻止了 OBS 连接到 SRS。
|
|||
|
|
|
|||
|
|
#### 解决方法:
|
|||
|
|
以管理员身份运行 PowerShell,执行:
|
|||
|
|
```powershell
|
|||
|
|
netsh advfirewall firewall add rule name="RTMP Server" dir=in action=allow protocol=TCP localport=1935
|
|||
|
|
netsh advfirewall firewall add rule name="RTMP Server Out" dir=out action=allow protocol=TCP localport=1935
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 诊断 B:检查 SRS 日志
|
|||
|
|
|
|||
|
|
#### 查看 Docker 日志:
|
|||
|
|
```bash
|
|||
|
|
docker logs srs-server --tail 50
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
查找是否有连接尝试或错误信息。
|
|||
|
|
|
|||
|
|
### 诊断 C:使用简化的测试地址
|
|||
|
|
|
|||
|
|
#### 测试 1:使用最简单的配置
|
|||
|
|
在 OBS 中:
|
|||
|
|
```
|
|||
|
|
服务器: rtmp://localhost:1935/live
|
|||
|
|
串流密钥: test123
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
然后开始推流,访问:
|
|||
|
|
```
|
|||
|
|
http://localhost:1985/api/v1/streams/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
如果能看到 `"name": "test123"`,说明 OBS 和 SRS 连接正常,问题在于 streamKey。
|
|||
|
|
|
|||
|
|
### 诊断 D:检查 OBS 版本
|
|||
|
|
|
|||
|
|
#### 确认 OBS 版本
|
|||
|
|
1. 点击 **帮助** → **关于**
|
|||
|
|
2. 确认版本号(推荐 28.0 或更高)
|
|||
|
|
|
|||
|
|
#### 如果版本太旧
|
|||
|
|
下载最新版本:https://obsproject.com/download
|
|||
|
|
|
|||
|
|
### 诊断 E:重启所有服务
|
|||
|
|
|
|||
|
|
#### 完全重启流程:
|
|||
|
|
```bash
|
|||
|
|
# 1. 停止 OBS 推流
|
|||
|
|
# 2. 关闭 OBS
|
|||
|
|
|
|||
|
|
# 3. 重启 SRS Docker
|
|||
|
|
docker restart srs-server
|
|||
|
|
|
|||
|
|
# 4. 重启后端服务器
|
|||
|
|
# 在命令行按 Ctrl+C 停止,然后重新运行:
|
|||
|
|
cd live-streaming
|
|||
|
|
node server/index.js
|
|||
|
|
|
|||
|
|
# 5. 等待 5 秒
|
|||
|
|
|
|||
|
|
# 6. 重新打开 OBS
|
|||
|
|
|
|||
|
|
# 7. 重新配置推流地址
|
|||
|
|
|
|||
|
|
# 8. 开始推流
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📋 完整的正确操作流程(从头开始)
|
|||
|
|
|
|||
|
|
### 1. 确保所有服务运行
|
|||
|
|
|
|||
|
|
#### 检查 Docker
|
|||
|
|
```bash
|
|||
|
|
docker ps
|
|||
|
|
```
|
|||
|
|
应该看到 `srs-server` 在运行。
|
|||
|
|
|
|||
|
|
#### 启动后端
|
|||
|
|
```bash
|
|||
|
|
cd live-streaming
|
|||
|
|
node server/index.js
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 在 Android 应用中创建直播间
|
|||
|
|
|
|||
|
|
1. 打开应用
|
|||
|
|
2. 点击"开始直播"
|
|||
|
|
3. 填写:
|
|||
|
|
- 标题:测试直播
|
|||
|
|
- 主播:小明
|
|||
|
|
4. 点击"创建"
|
|||
|
|
5. **记下完整的 streamKey**(例如:7f4acb94-f91c-4ec0-84eb-fbb1855f8f18)
|
|||
|
|
|
|||
|
|
### 3. 配置 OBS(重要!)
|
|||
|
|
|
|||
|
|
1. 打开 OBS Studio
|
|||
|
|
2. 点击 **"设置"**
|
|||
|
|
3. 左侧选择 **"推流"**
|
|||
|
|
4. **服务**:下拉选择 **"自定义..."**
|
|||
|
|
5. **服务器**:输入(注意不要有空格)
|
|||
|
|
```
|
|||
|
|
rtmp://localhost:1935/live/7f4acb94-f91c-4ec0-84eb-fbb1855f8f18
|
|||
|
|
```
|
|||
|
|
6. **串流密钥**:留空(不要填任何东西)
|
|||
|
|
7. 点击 **"应用"**
|
|||
|
|
8. 点击 **"确定"**
|
|||
|
|
|
|||
|
|
### 4. 添加视频源(如果还没有)
|
|||
|
|
|
|||
|
|
1. 在"来源"区域点击 **+** 号
|
|||
|
|
2. 选择 **"显示器捕获"**
|
|||
|
|
3. 命名:屏幕
|
|||
|
|
4. 点击 **"确定"**
|
|||
|
|
5. 选择你的显示器
|
|||
|
|
6. 点击 **"确定"**
|
|||
|
|
|
|||
|
|
### 5. 开始推流
|
|||
|
|
|
|||
|
|
1. 点击 **"开始推流"**
|
|||
|
|
2. 观察右下角状态栏
|
|||
|
|
|
|||
|
|
**成功标志**:
|
|||
|
|
```
|
|||
|
|
直播中 | 00:00:05 | 2500 kb/s | 0 丢帧
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**失败标志**:
|
|||
|
|
- 提示"连接失败"
|
|||
|
|
- 状态栏显示红色
|
|||
|
|
- 没有比特率数据
|
|||
|
|
|
|||
|
|
### 6. 验证推流(推流后立即检查)
|
|||
|
|
|
|||
|
|
#### 方法 1:浏览器
|
|||
|
|
访问:http://localhost:1985/api/v1/streams/
|
|||
|
|
|
|||
|
|
应该看到你的 streamKey。
|
|||
|
|
|
|||
|
|
#### 方法 2:Android 应用
|
|||
|
|
1. 下拉刷新列表
|
|||
|
|
2. 应该显示"直播中"(红色)
|
|||
|
|
3. 点击进入观看
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎥 OBS 推流设置截图说明
|
|||
|
|
|
|||
|
|
### 正确的设置界面
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌──────────────────────────────────────────┐
|
|||
|
|
│ 设置 │
|
|||
|
|
├──────────────────────────────────────────┤
|
|||
|
|
│ 推流 │
|
|||
|
|
│ │
|
|||
|
|
│ 服务: [自定义... ▼] │
|
|||
|
|
│ │
|
|||
|
|
│ 服务器: │
|
|||
|
|
│ ┌────────────────────────────────────┐ │
|
|||
|
|
│ │rtmp://localhost:1935/live/7f4acb94-│ │
|
|||
|
|
│ │f91c-4ec0-84eb-fbb1855f8f18 │ │
|
|||
|
|
│ └────────────────────────────────────┘ │
|
|||
|
|
│ │
|
|||
|
|
│ 串流密钥: │
|
|||
|
|
│ ┌────────────────────────────────────┐ │
|
|||
|
|
│ │ │ │ ← 留空!
|
|||
|
|
│ └────────────────────────────────────┘ │
|
|||
|
|
│ │
|
|||
|
|
│ □ 使用身份验证 │
|
|||
|
|
│ │
|
|||
|
|
│ [取消] [确定] │
|
|||
|
|
└──────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📞 调试命令速查
|
|||
|
|
|
|||
|
|
### 检查 SRS 推流状态
|
|||
|
|
```bash
|
|||
|
|
curl http://localhost:1985/api/v1/streams/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 检查直播间状态
|
|||
|
|
```bash
|
|||
|
|
curl http://localhost:3001/api/rooms/7f4acb94-f91c-4ec0-84eb-fbb1855f8f18
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 检查 Docker 状态
|
|||
|
|
```bash
|
|||
|
|
docker ps
|
|||
|
|
docker logs srs-server --tail 20
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 检查端口
|
|||
|
|
```bash
|
|||
|
|
netstat -ano | findstr :1935
|
|||
|
|
netstat -ano | findstr :3001
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 重启 SRS
|
|||
|
|
```bash
|
|||
|
|
docker restart srs-server
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ⚠️ 关键注意事项
|
|||
|
|
|
|||
|
|
### ✅ 必须做对的事情
|
|||
|
|
|
|||
|
|
1. **地址必须用 localhost**
|
|||
|
|
- ✅ `rtmp://localhost:1935/...`
|
|||
|
|
- ❌ `rtmp://10.0.2.2:1935/...`
|
|||
|
|
|
|||
|
|
2. **streamKey 必须完整**
|
|||
|
|
- ✅ `7f4acb94-f91c-4ec0-84eb-fbb1855f8f18`
|
|||
|
|
- ❌ `7f4acb94-f91c-4ec0`
|
|||
|
|
|
|||
|
|
3. **串流密钥框必须为空**
|
|||
|
|
- 因为 streamKey 已经包含在服务器地址中了
|
|||
|
|
|
|||
|
|
4. **推流后立即验证**
|
|||
|
|
- 不要等太久,推流后 5 秒内就应该能在 SRS 中看到
|
|||
|
|
|
|||
|
|
### ❌ 常见错误
|
|||
|
|
|
|||
|
|
1. 复制地址时带了空格或换行
|
|||
|
|
2. 使用了 `10.0.2.2` 而不是 `localhost`
|
|||
|
|
3. streamKey 不完整或错误
|
|||
|
|
4. 在"串流密钥"框中又填了一遍 streamKey
|
|||
|
|
5. 防火墙阻止了连接
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 💡 快速测试方法
|
|||
|
|
|
|||
|
|
如果你想快速测试 OBS 和 SRS 是否能正常连接:
|
|||
|
|
|
|||
|
|
### 简化测试
|
|||
|
|
1. OBS 设置:
|
|||
|
|
```
|
|||
|
|
服务器: rtmp://localhost:1935/live
|
|||
|
|
串流密钥: test
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. 开始推流
|
|||
|
|
|
|||
|
|
3. 访问:http://localhost:1985/api/v1/streams/
|
|||
|
|
|
|||
|
|
4. 如果能看到 `"name": "test"`,说明连接正常
|
|||
|
|
|
|||
|
|
5. 然后再改回正确的 streamKey
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**现在按照上面的步骤重新配置 OBS,特别注意地址格式!** 🚀
|
|||
|
|
|
|||
|
|
如果还是不行,请告诉我:
|
|||
|
|
1. OBS 状态栏显示什么?
|
|||
|
|
2. 访问 http://localhost:1985/api/v1/streams/ 看到什么?
|
|||
|
|
3. OBS 日志中有什么错误?
|