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