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