远程软件
Go to file
郑博文 e814cb64e7 fix(agent): vendor nvenc 并补 FORCEIDR 标志——修复运行期关键帧请求被静默忽略
根因(实测确认,非推测)
上游 nvenc 0.1.0 的 encode_picture 只设置 picture_type=NV_ENC_PIC_TYPE_IDR,
却从未设置 encode_pic_flags=NV_ENC_PIC_FLAG_FORCEIDR。NVENC 会据此忽略请求、
继续输出 P 帧。首帧之所以「看起来正常」,是因为 frame_idx==0 本来就强制 IDR,
与该字段无关——这也是该缺陷长期未被发现的原因。

证据(同一 frame_count=4,修复前后)
- 修复前:输出 NAL 首字节 0x61 → 0x61 & 0x1F = 1 = 普通 P 片
- 修复后:输出 NAL 首字节 0x65 → 0x65 & 0x1F = 5 = IDR 片

影响
这解释了构建运行手册 §6.1 记录的「静止桌面黑屏」:NVENC 路径的重编 IDR 从未
真正生效,KeyFrameReq 拿不到 IDR 就无法从解码错误中恢复。

改动
- 新增 vendor/nvenc(上游为 MIT 许可,可自由修改分发,符合商用要求)
- vendor/nvenc/src/safe/encoder.rs:picture_type=IDR 时置 ForceIDR;
  IntraRefresh 时置 ForceIntra。改动处有「本项目补丁」注释标记
- agent/Cargo.toml:nvenc 改为 path 依赖指向 vendor 版本

建议后续向上游提 PR(github.com/AlsoSylv/nvenc),以降低长期维护成本。

验证:跳帧后发 KeyFrameReq,第 3 帧即收到 IDR 并解码成功
2026-10-28 16:05:41 +08:00
.cargo init: MVP remote desktop (agent/viewer/common) with H.264 pipeline 2026-10-23 09:17:55 +08:00
agent fix(agent): vendor nvenc 并补 FORCEIDR 标志——修复运行期关键帧请求被静默忽略 2026-10-28 16:05:41 +08:00
agent-core feat(common): 协议 v2——版本号 + 帧头 seq/keyframe + 长度下界校验 2026-10-28 16:05:41 +08:00
common feat(common): 协议 v2——版本号 + 帧头 seq/keyframe + 长度下界校验 2026-10-28 16:05:41 +08:00
linux-agent feat(common): 协议 v2——版本号 + 帧头 seq/keyframe + 长度下界校验 2026-10-28 16:05:41 +08:00
scripts fix(linux-agent): 修正坐标换算单测期望值 + 冒烟脚本纳入单测 2026-10-23 15:04:56 +08:00
tools fix(tools): 探针区分信令回复与打洞包,修掉打洞假阳性 2026-10-23 18:02:14 +08:00
vendor/nvenc fix(agent): vendor nvenc 并补 FORCEIDR 标志——修复运行期关键帧请求被静默忽略 2026-10-28 16:05:41 +08:00
viewer feat(common): 协议 v2——版本号 + 帧头 seq/keyframe + 长度下界校验 2026-10-28 16:05:41 +08:00
.gitattributes feat(agent): 新增 agent-core 与 Linux 被控端(X11 + XTest,纯新增不动 agent/) 2026-10-23 13:31:08 +08:00
.gitignore init: MVP remote desktop (agent/viewer/common) with H.264 pipeline 2026-10-23 09:17:55 +08:00
B侧设计文档.md docs: B侧设计文档(联调基线/码率自适应/打洞中继/多屏文件) 2026-10-23 09:34:21 +08:00
Cargo.lock fix(agent): vendor nvenc 并补 FORCEIDR 标志——修复运行期关键帧请求被静默忽略 2026-10-28 16:05:41 +08:00
Cargo.toml feat(agent): 新增 agent-core 与 Linux 被控端(X11 + XTest,纯新增不动 agent/) 2026-10-23 13:31:08 +08:00
Git协作规范.md docs: 两人分工方案定稿 2026-10-23 09:31:52 +08:00
README.md docs: 打洞设计/多平台架构/借鉴映射/验证记录 2026-10-23 17:32:17 +08:00
借鉴映射与落地规范.md docs: 打洞设计/多平台架构/借鉴映射/验证记录 2026-10-23 17:32:17 +08:00
多平台架构设计.md docs: 打洞设计/多平台架构/借鉴映射/验证记录 2026-10-23 17:32:17 +08:00
打洞与信令设计.md docs: 打洞设计/多平台架构/借鉴映射/验证记录 2026-10-23 17:32:17 +08:00
打洞验证记录.md fix(tools): 探针区分信令回复与打洞包,修掉打洞假阳性 2026-10-23 18:02:14 +08:00
构建运行手册.md fix(linux-agent): 修正坐标换算单测期望值 + 冒烟脚本纳入单测 2026-10-23 15:04:56 +08:00

mvp-remote

自研远程桌面控制软件(办公场景),技术路线参考网易 UU 远程逆向分析结论。

架构

Crate 角色 说明
common 协议库 控制消息 / 视频帧线格式,三端共享契约
agent 被控端 DXGI 屏幕采集 + openh264(H.264) 编码 + QUIC 服务 + SendInput 键鼠注入
viewer 主控端 QUIC 客户端 + openh264 解码 + minifb 渲染 + 键鼠采集 + 延迟 HUD

构建

cargo build --release

产物:target/release/agent.exe(被控端)、viewer.exe(主控端),需附带 3 个 mingw 运行库 DLL(libstdc++-6 / libgcc_s_seh-1 / libwinpthread-1)。

运行

# 被控机
agent.exe --port 47800 --code 123456
# 主控机
viewer.exe --addr <被控机IP> --port 47800 --code 123456

详见《构建运行手册.md》、《Git协作规范.md》与《打洞与信令设计.md》。