# w-link **Repository Path**: Ipower/w-link ## Basic Information - **Project Name**: w-link - **Description**: 局域网内非常好用的投屏工具,pc -- android - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-11-05 - **Last Updated**: 2026-11-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # W-Link 局域网投屏,设备之间点对点直连,不经过任何服务器。 **电脑 ↔ 电脑 · 电脑 ↔ 手机 · 手机 ↔ 手机**,任意一端都能投出或接收。 - 电脑端:Rust,单个 `w-link.exe`(约 35 MB),免安装、无第三方 DLL - 手机端:Kotlin + Google WebRTC,Android 5.1(API 22)及以上 - 发现用 mDNS,控制走 WebSocket + JSON,媒体走 WebRTC(DTLS-SRTP 端到端加密) - 硬件编解码优先(NVENC / QSV / MediaCodec),不可用时自动回落软件编码 ## 特性 | 能力 | 说明 | |------|------| | 投屏码连接 | 每台设备启动生成一个 6 位码并大字展示,投屏方输入即连;不注册账号、不保存连接记录,重启后换新码 | | 投屏源 | 整个桌面 / 单个窗口(被遮挡也能采)/ 手机屏幕 | | 音频 | 电脑采集系统回环,手机采集麦克风;默认关闭,两端都可随时开关或静音 | | 低延迟 | 丢帧不排队、NACK 重传 + PLI 补关键帧、GCC 带宽估计,局域网典型 60–150 ms | | 后台保活 | 手机切后台或息屏继续接收;对端自动暂停推流,回前台强制关键帧恢复 | | 零运行时依赖 | 采集 WGC、编解码 Media Foundation、音频 WASAPI,全部是 Windows 自带组件 | ## 快速开始 ### 电脑端 要求 Windows 10 1803+、Rust 1.75+(GNU 目标,见 [docs/build.md](docs/build.md))。 ```powershell cd pc powershell -ExecutionPolicy Bypass -File scripts\build-mingw.ps1 # 产出 target\release\w-link.exe powershell -ExecutionPolicy Bypass -File scripts\build-dist.ps1 # 打包 dist\w-link.zip ``` **必须**使用脚本构建:脚本会让 opus 关掉栈保护,否则程序能编过,但一开音频就崩溃。 环境要求、工具链选择、常见构建错误见 [docs/build.md](docs/build.md)。 ### 手机端 要求 JDK 17、Android SDK 34。 ```bash cd android ./gradlew assembleDebug adb install -r app/build/outputs/apk/debug/app-debug.apk ``` ### 开始投屏 1. 两台设备接入同一局域网并启动,各自界面显示本机 6 位投屏码 2. 在投屏方输入对方的投屏码 3. 电脑作为发送端时选择投屏源;手机发起时先选择画质档位 也可以跳过界面直接投: ```powershell w-link.exe --code <投屏码> --source desktop w-link.exe --code <投屏码> --host 192.168.1.20:18765 # 跳过 mDNS 直连 w-link.exe --selftest 6 # 本机采集→编码→解码自检 ``` ## 架构 ``` ┌──────────────────────────────────────────────┐ │ 采集 WGC / MediaProjection │ ├──────────────────────────────────────────────┤ │ 编解码 Media Foundation / MediaCodec + Opus │ ├──────────────────────────────────────────────┤ │ 媒体 WebRTC:ICE / DTLS / SRTP / RTP │ ├──────────────────────────────────────────────┤ │ 信令 WebSocket + JSON │ ├──────────────────────────────────────────────┤ │ 发现 mDNS / DNS-SD (_toupin._tcp) │ └──────────────────────────────────────────────┘ ``` - 视频 H.264,音频 Opus。电脑端用进程内的 `webrtc-rs`,手机端用 `org.webrtc` - 每台设备同时运行信令服务端和客户端,所以任意方向都能发起 - 投屏码不写进 mDNS 广播:广播只用于拿到候选地址,鉴权靠码本身 细节见 [docs/architecture.md](docs/architecture.md),消息格式见 [docs/protocol.md](docs/protocol.md)。 ## 目录结构 ``` w-link/ ├── proto/rust/ # 共享协议(Rust + serde),电脑端直接依赖 ├── proto/android/ # 共享协议(Kotlin + kotlinx.serialization),字段与 Rust 一致 ├── pc/ # 电脑端:WGC 采集 + Media Foundation + webrtc-rs + egui ├── android/ # 手机端:MediaProjection + MediaCodec + org.webrtc ├── docs/ # 架构、协议、媒体栈、构建与排错 └── tools/ # 辅助脚本 ``` > 包名 `com.toupin` 和 mDNS 服务类型 `_toupin._tcp` 沿用早期代号,为保持协议兼容没有改动。 ## 文档 | 文档 | 内容 | |------|------| | [architecture.md](docs/architecture.md) | 分层设计、连接与投屏流程、延迟预算 | | [protocol.md](docs/protocol.md) | mDNS 记录、信令消息、能力协商、错误码 | | [pc-media-stack.md](docs/pc-media-stack.md) | 电脑端媒体管线、延迟调优与环境变量 | | [android.md](docs/android.md) | 手机端会话引擎、采集、渲染、后台策略 | | [ui-design.md](docs/ui-design.md) | 两端设计令牌与界面结构 | | [build.md](docs/build.md) | Windows / Android 构建细节 | | [troubleshooting.md](docs/troubleshooting.md) | 已知问题与踩坑记录 | ## 已知限制 项目处于早期阶段(0.1.x),协议与接口仍可能变化。 - 仅支持 Windows 与 Android,且必须处于同一局域网(mDNS 可跨网段时除外) - 手机音频采集是麦克风,系统内录(`AudioPlaybackCapture`)尚未实现 - 摄像头源在协议里已定义,尚未接入采集实现 - 电脑端接收画面为独立窗口,未内嵌进主界面 - Windows N 版需先安装 Media Feature Pack - DRM 保护内容无法采集 ## 许可 [Apache License 2.0](LICENSE)