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

10 KiB
Raw Permalink Blame History

推流问题完整诊断与解决

🔍 当前状态

  • 后端服务器运行正常(端口 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/...  ← 错误!

错误 2streamKey 不完整

串流密钥: 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/

成功时应该看到

{
  "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
}

方法 3Android 应用

  1. 在 Android 模拟器中下拉刷新
  2. 查看直播间状态是否变成"直播中"

🐛 如果还是失败

诊断 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 版本

  1. 点击 帮助关于
  2. 确认版本号(推荐 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 应用中创建直播间

  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 推流状态

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

⚠️ 关键注意事项

必须做对的事情

  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 日志中有什么错误?