-
Notifications
You must be signed in to change notification settings - Fork 181
Open
Description
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)
详细复现步骤
- 启动 Apollo 程序 (
sunshine.exe) - 程序成功初始化:
- 编译着色器 ✓
- 创建系统托盘 ✓
- 检测并初始化 AMD AMF 编码器 ✓
- 启动 Web UI (https://localhost:47990) ✓
- 注册 mDNS 服务 ✓
- 关键问题: 在 "Registered Apollo mDNS service" 后,程序日志停止
- 检查网络端口:
netstat -ano -p UDP | findstr "47998 48000 47999"- 结果:无输出(端口未被绑定)
- 检查进程:
tasklist | findstr "sunshine"- 结果:进程不存在(程序已崩溃)
- 使用 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:
- TCP Web UI 端口 (47990) - 能够绑定但存在资源泄漏(18个 CLOSE_WAIT 连接)
- UDP 控制端口 (47989/47999) - 完全未绑定
- 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)
建议的调试方向
- 网络模块: 检查 UDP socket 绑定逻辑,特别是 47998/48000 端口的初始化代码
- 错误处理: 添加更详细的错误日志,记录端口绑定失败的原因
- 资源管理: 修复 TCP 连接的 CLOSE_WAIT 泄漏问题
- 崩溃恢复: 程序应该在端口绑定失败时输出错误而不是静默崩溃
附加信息
硬件信息
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
Labels
No labels