zhibo/推流问题完整诊断.md

439 lines
10 KiB
Markdown
Raw Permalink Normal View History

2025-12-17 08:47:15 +08:00
# 推流问题完整诊断与解决
## 🔍 当前状态
- ✅ 后端服务器运行正常(端口 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
}
```
**方法 3Android 应用**
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。
#### 方法 2Android 应用
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 日志中有什么错误?