zhibo/推流问题完整诊断.md
xiao12feng@outlook.com 40bfd4ec5c 直播功能正常使用
2025-12-17 08:47:15 +08:00

439 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 推流问题完整诊断与解决
## 🔍 当前状态
- ✅ 后端服务器运行正常(端口 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 日志中有什么错误?