Skip to content

UDP视频流端口47998/48000无法绑定,导致客户端报错"没有从目标计算机接收到视频画面" #1272

@jju666

Description

@jju666

Apollo UDP视频流端口绑定失败导致客户端无法接收画面

问题描述

Apollo 0.4.6 启动后无法绑定UDP视频流端口 47998 和 48000,导致 Moonlight 客户端连接后报错:

没有从目标计算机接收到视频画面,检查防火墙和端口转发规则:UDP 47998,UDP 48000

症状总结:

  • 程序能够正常启动并初始化编码器
  • Web UI 可以正常访问 (https://localhost:47990)
  • mDNS 服务成功注册
  • 但 UDP 端口 47998/48000 从未被绑定
  • 程序在 mDNS 注册后静默崩溃,无错误日志
  • 客户端连接11秒后自动断开

系统环境

Apollo版本:0.4.6
Commit:0cd32abaaa141d262477d039ac447b38fe99c394
发布商:SudoMaker
操作系统:Windows (推测 Windows 10/11)
显卡:AMD Radeon RX 9070 XT (16304 MiB)
显示器:ASUS VG34VQL3A (3440x1440@165Hz)
编码器:AMD AMF (h264_amf, hevc_amf, av1_amf)

详细复现步骤

  1. 启动 Apollo 程序 (sunshine.exe)
  2. 程序成功初始化:
    • 编译着色器 ✓
    • 创建系统托盘 ✓
    • 检测并初始化 AMD AMF 编码器 ✓
    • 启动 Web UI (https://localhost:47990) ✓
    • 注册 mDNS 服务 ✓
  3. 关键问题: 在 "Registered Apollo mDNS service" 后,程序日志停止
  4. 检查网络端口:netstat -ano -p UDP | findstr "47998 48000 47999"
    • 结果:无输出(端口未被绑定)
  5. 检查进程:tasklist | findstr "sunshine"
    • 结果:进程不存在(程序已崩溃)
  6. 使用 Moonlight 客户端连接:
    • 连接建立 ✓
    • 编码器重新初始化 ✓
    • 11秒后客户端报错:"没有从目标计算机接收到视频画面"
    • 客户端断开连接

网络诊断结果

启动前的端口状态

# 旧的 sunshine.exe 进程 (PID 18200) 占用端口
TCP    0.0.0.0:47990          0.0.0.0:0              LISTENING
UDP    0.0.0.0:47999          *:*                    (PID 18200)
# 注意:47998 和 48000 从未出现

启动后的端口状态

netstat -ano -p UDP | findstr "47998 48000 47999 47989"
# 无任何输出 - 所有端口都未绑定

TCP 端口问题

# 发现 18 个 CLOSE_WAIT 连接在 47990 端口
TCP    127.0.0.1:47990        127.0.0.1:*            CLOSE_WAIT (x18)
# 表明存在资源泄漏问题

日志片段

正常启动日志

[2025-12-01 18:09:22.425]: Info: Apollo version: 0.4.6 commit: 0cd32abaaa141d262477d039ac447b38fe99c394
[2025-12-01 18:09:22.425]: Info: config: 'locale' = zh
[2025-12-01 18:09:22.425]: Info: config: 'address_family' = ipv4
[2025-12-01 18:09:22.426]: Info: config: 'port' = 47989
[2025-12-01 18:09:22.508]: Info: Compiled shaders
[2025-12-01 18:09:23.075]: Info: Found H.264 encoder: h264_amf [amdvce]
[2025-12-01 18:09:23.075]: Info: Found HEVC encoder: hevc_amf [amdvce]
[2025-12-01 18:09:23.075]: Info: Found AV1 encoder: av1_amf [amdvce]
[2025-12-01 18:09:23.077]: Info: Configuration UI available at [https://localhost:47990]
[2025-12-01 18:09:23.833]: Info: Registered Apollo mDNS service
# 日志在此处停止,无错误信息,但程序已崩溃

客户端连接时的日志

[2025-12-01 17:40:57.830]: Info: Client Requested bitrate is [10000kbps]
[2025-12-01 17:40:57.830]: Info: Host Streaming bitrate is [10000kbps]
[2025-12-01 17:40:57.830]: Info: New streaming session started [active sessions: 1]
[2025-12-01 17:40:57.855]: Info: CLIENT CONNECTED
[2025-12-01 17:40:57.939]: Info: Client dynamicRange: 0, Display is HDR: false
[2025-12-01 17:40:57.939]: Info: Creating encoder [hevc_amf]
[2025-12-01 17:40:58.322]: Info: Opus initialized: 48 kHz, 2 channels, 96 kbps (total), LOWDELAY
# 音频初始化成功,但视频流无法发送
[2025-12-01 17:41:08.741]: Info: CLIENT DISCONNECTED
[2025-12-01 17:41:09.180]: Info: Session pausing for app [Desktop].

已尝试的解决方案(均无效)

方案1:重启程序清理资源

taskkill /F /IM sunshine.exe /T
timeout /t 5
cd /d D:\Apollo
start sunshine.exe

结果: UDP 端口仍未绑定,问题依旧

方案2:修改配置文件明确指定端口

config/sunshine.conf 中添加:

port = 47989
address_family = ipv4
origin_web_ui_port = 47990

结果: 配置被正确加载,但 UDP 端口仍未绑定

方案3:尝试通过服务启动

Stop-Service -Name "ApolloService" -Force
Start-Service -Name "ApolloService"

结果: 服务启动失败,错误代码 32(文件被占用)

配置文件

sunshine.conf

locale = zh
server_cmd = [{"cmd":"bubbles.scr","elevated":false,"name":"Bubbles"}]

# Network configuration - Added to fix UDP port binding issue
port = 47989
address_family = ipv4
origin_web_ui_port = 47990

apps.json

{
    "apps": [
        {
            "allow-client-commands": false,
            "image-path": "desktop.png",
            "name": "Desktop",
            "uuid": "99423D00-4E95-490F-E39E-244CBDF06854"
        },
        {
            "detached": ["steam://open/bigpicture"],
            "image-path": "steam.png",
            "name": "Steam Big Picture",
            "prep-cmd": [
                {
                    "do": "",
                    "elevated": false,
                    "undo": "steam://close/bigpicture"
                }
            ],
            "uuid": "136AC2CE-562E-6007-938B-48CA220C4F82"
        }
    ],
    "env": {},
    "version": 2
}

技术分析

问题根源

程序在网络初始化阶段存在严重bug:

  1. TCP Web UI 端口 (47990) - 能够绑定但存在资源泄漏(18个 CLOSE_WAIT 连接)
  2. UDP 控制端口 (47989/47999) - 完全未绑定
  3. UDP 视频流端口 (47998/48000) - 完全未绑定(导致无法传输视频)

程序在尝试绑定 UDP 端口时失败并静默崩溃,但日志中没有记录任何错误信息。

期望的端口绑定状态

TCP    0.0.0.0:47990          0.0.0.0:0              LISTENING
UDP    0.0.0.0:47989          *:*
UDP    0.0.0.0:47998          *:*                    # 缺失!
UDP    0.0.0.0:47999          *:*
UDP    0.0.0.0:48000          *:*                    # 缺失!

影响范围

严重性: 高 - 完全阻止视频串流功能

受影响用户:

  • 之前能正常工作,Moonlight 客户端连接后出现问题的用户
  • 使用 AMD 显卡的用户(可能与 AMD AMF 编码器相关)
  • 使用高分辨率显示器的用户(3440x1440)

建议的调试方向

  1. 网络模块: 检查 UDP socket 绑定逻辑,特别是 47998/48000 端口的初始化代码
  2. 错误处理: 添加更详细的错误日志,记录端口绑定失败的原因
  3. 资源管理: 修复 TCP 连接的 CLOSE_WAIT 泄漏问题
  4. 崩溃恢复: 程序应该在端口绑定失败时输出错误而不是静默崩溃

附加信息

硬件信息

Device Description : AMD Radeon RX 9070 XT
Device Vendor ID   : 0x00001002
Device Device ID   : 0x00007550
Device Video Mem   : 16304 MiB
Feature Level      : 0x0000B100
Active GPU has HAGS enabled

编码器信息

Found H.264 encoder: h264_amf [amdvce]
Found HEVC encoder: hevc_amf [amdvce]
Found AV1 encoder: av1_amf [amdvce]

联系方式

如果需要更多日志或诊断信息,我可以提供完整的:

  • sunshine.log 文件
  • sunshine.log.backup 文件
  • 完整的 netstat 输出
  • Windows 事件查看器日志

感谢 Apollo 团队的辛勤工作!期待修复。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions