[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81946":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":37,"readmeContent":38,"aiSummary":39,"trendingCount":15,"starSnapshotCount":15,"syncStatus":40,"lastSyncTime":41,"discoverSource":42},81946,"Cloud-Phone","yiyifred\u002FCloud-Phone","yiyifred","A project for online screen mirroring of mobile phones.","",null,"C",42,11,1,0,7,14,21,3.24,"Apache License 2.0",false,"main",true,[25,26,27,28,29,30,31,32,33,34,35,36],"android","cloud","cloud-phone","cloudphone","control","phone","remote-screen","remote-screen-control","scrcpy","screen-capture","screen-control","screen-copy","2026-06-12 02:04:21","\u003Cdiv align=\"center\">\n\n# Cloud Phone\n\n**用浏览器连真机：投屏、触控、文件、应用、终端，都在一个页面里；另有 Android 伴侣 App，在手机上管理设备与全屏投屏。**\n\n当前版本：**v0.12.14** · Node 后端 + Vue 3 Web + Android 客户端 · 基于 [scrcpy](https:\u002F\u002Fgithub.com\u002FGenymobile\u002Fscrcpy) 4.0 自编译 WebSocket 投屏\n\n[English](README.EN.md) · **中文**\n\n\u003C\u002Fdiv>\n\n---\n\n## 相关链接\n\n| 平台 | 地址 |\n|------|------|\n| **GitHub** | [github.com\u002Fyiyifred\u002FCloud-Phone](https:\u002F\u002Fgithub.com\u002Fyiyifred\u002FCloud-Phone) |\n| **Gitee** | [gitee.com\u002Fyiyifred\u002FCloud-Phone](https:\u002F\u002Fgitee.com\u002Fyiyifred\u002FCloud-Phone) |\n| **LINUX DO** | [linux.do](https:\u002F\u002Flinux.do\u002F) |\n\n---\n\n## 目录\n\n- [相关链接](#相关链接)\n- [为什么做这个项目](#为什么做这个项目)\n- [亮点](#亮点)\n- [截图（预留）](#截图预留)\n- [功能一览](#功能一览)\n- [Android 客户端](#android-客户端)\n- [快速开始](#快速开始)\n- [目录结构](#目录结构)\n- [API 摘要](#api-摘要)\n- [构建 scrcpy](#构建-scrcpy)\n- [环境变量](#环境变量)\n- [社区准则](#社区准则)\n- [致谢](#致谢)\n- [赞助](#赞助)\n- [English](README.EN.md)\n\n---\n\n## 为什么做这个项目\n\n手里连着几台 Android 调试机，经常要在电脑上改配置、装包、看日志。命令行 `adb` 够用，但投屏参数一长串就烦；桌面版 scrcpy 很强，可我想在**浏览器**里统一管设备列表、投屏、文件和应用。\n\nCloud Phone 就是把这件事做成一个本地 Web 控制台：后端用内置 ADB + 改过的 scrcpy-server 推流，前端用 WebCodecs 解码 H.264，协议对齐 [ws-scrcpy](https:\u002F\u002Fgithub.com\u002FNetrisTV\u002Fws-scrcpy)。镜像参数面板参考了 [escrcpy](https:\u002F\u002Fgithub.com\u002Fviarotel-org\u002Fescrcpy) 的分组习惯，但代码是本仓库自己写的，不依赖 escrcpy 运行时。\n\n**适合谁用**\n\n- 需要可调编码器、虚拟屏、摄像头投屏、录屏的人\n- 想在同一界面里顺便开文件管理、应用管理、Shell 的人\n- 想在手机上查看设备画廊、改投屏参数并全屏遥控的人（Android 伴侣 App）\n\n---\n\n## 亮点\n\n| 点 | 说明 |\n|---|---|\n| **浏览器投屏** | H.264 经 WebSocket 推到画布，WebCodecs 硬解；触摸\u002F鼠标按 scrcpy 4.0 协议注入 |\n| **官方 4.0 底座** | 在 `backend\u002Fsource\u002Fscrcpy` 上移植 WebSocket，server 版本与桌面客户端一致，避免 jar 版本打架 |\n| **参数够全** | 镜像：裁剪、采集方向、虚拟屏预设、音频源\u002F编码器、关屏保活等；摄像头模式：手电、变焦（Android 12+） |\n| **不投屏也能干活** | 文件管理、应用管理、ADB 终端、画廊截屏——设备在线即可，不必先开 cast |\n| **投屏顶栏顺手** | 多任务\u002F主屏\u002F返回\u002F电源\u002F音量\u002F旋转\u002F剪贴板\u002F录屏\u002F截屏；导航键支持按住与手机同步 |\n| **交互更统一** | 常用图标迁移 Lucide 图标库，统一线稿风格；补充焦点可见态与 hover 反馈 |\n| **一键开发** | 根目录 `npm run dev` 先等后端 `\u002Fhealth` 再起 Vite，代理失败有明确提示 |\n| **主题** | 左下角浅色\u002F深色切换，偏好写本地 |\n| **多语言** | 设置页切换界面语言（简中 \u002F English \u002F 繁中 \u002F 日本語 \u002F 한국어），核心界面即时切换 |\n| **API 安全** | 登录后会话鉴权；JSON 接口 AES-GCM 加密；WebSocket 需有效会话 |\n| **设备入口** | 画廊右上角提供「添加设备」弹窗；安卓 USB 引导 + 配对码配对（IP\u002F端口\u002F配对码，自动扫描连接），鸿蒙\u002F苹果暂未开发 |\n| **Android 伴侣 App** | 连接同一后端：设备画廊、完整设置页、投屏参数工作区、横屏全屏 H.264 投屏；流参数与 Web 对齐 |\n| **移动投屏** | Android 端镜像导航键 \u002F 摄像头手电变焦；Material 动效、工具栏自动隐藏；画布触控与黑边适配 |\n\n---\n\n## 截图\n\n| 位置 | 建议文件名 | 放什么 |\n|---|---|---|\n| 设备画廊 | `images\u002Freadme\u002Fgallery.png` | 多设备卡片、在线数、实时截图 |\n| 镜像投屏 | `images\u002Freadme\u002Fmirror-cast.png` | 左侧参数 + 右侧画面 + 顶栏 |\n| 摄像头投屏 | `images\u002Freadme\u002Fcamera-cast.png` | 摄像头模式与手电\u002F变焦 |\n| 文件管理 | `images\u002Freadme\u002Ffiles.png` | 地址栏、目录列表 |\n| 应用管理 | `images\u002Freadme\u002Fapps.png` | 应用列表与详情弹窗 |\n| 终端 | `images\u002Freadme\u002Fterminal.png` | xterm 彩色 Shell |\n\n```text\nimages\u002Freadme\u002F\n├── gallery.png\n├── mirror-cast.png\n├── camera-cast.png\n├── files.png\n├── apps.png\n└── terminal.png\n```\n\n图片已插入到下方对应功能小节中；这里仅列出文件名与建议用途。\n\n---\n\n## 功能一览\n\n### 设备画廊\n\n![设备画廊](images\u002Freadme\u002Fgallery.png)\n\n- 左侧 Tab：**设备**、**设置**\n- 自动发现 ADB 设备（内置 `platform-tools`），展示型号、厂商、IP、Android 版本、序列号、产品名\n- 每台设备约 **5 秒**刷新截图（可调），列表约 **1 秒**刷新；刷新时保留上一帧，不闪全屏 loading\n- 汇总在线\u002F离线数量、最近刷新时间，支持手动刷新\n- 点击卡片进入**设备工作区**\n\n### 设置与登录（Web）\n\n- 设置页横向布局，左侧二级菜单：**账号**、**外观**、**刷新**\n- **账号**：密码状态（默认 \u002F 已更新）、会话到期时间、修改密码\n- **外观**：界面语言（简中 \u002F English \u002F 繁中 \u002F 日本語 \u002F 한국어）、浅色\u002F深色主题；偏好写入浏览器 `localStorage`\n- **刷新**：设备列表与截图自动刷新间隔（1–120 秒，默认 1s \u002F 5s），保存后立即生效\n- 会话登录（默认密码 `admin`，首次使用请改密）；JSON API 登录后 AES-GCM 加密\n- **后端本地数据**：`backend\u002Fnode\u002Fdata\u002F` 存放 `auth.key` 与 `cloud-phone.db`，仅本机使用，勿提交到 Git\n\n> **说明**：文件管理、应用管理、ADB 终端目前仅在 **Web 设备工作区** 提供；Android App 聚焦设备发现、投屏参数与全屏遥控，见下文 [Android 客户端](#android-客户端)。\n\n### 设备工作区 · 镜像投屏（默认）\n\n![镜像投屏](images\u002Freadme\u002Fmirror-cast.png)\n\n**左侧参数**（Naive UI 折叠分组；下拉带顶部搜索 `MirrorSearchableSelect`）：\n\n| 分组 | 能力 |\n|---|---|\n| **视频** | 分辨率（长边）、码率、帧率、编码器（设备 `list_encoders`，超时回退通用列表）、采集方向、预览旋转（仅浏览器侧） |\n| **音频** | 开关、音频源、`audio-code`、码率、`audio-dup`（Android 13+）；可「禁用视频」仅音频（画布波形 + PCM，Android 11+） |\n| **设备** | 显示 ID、关屏投屏、保持唤醒、显示触摸点、关屏超时等 |\n| **屏幕** | 虚拟屏预设、`--new-display` 自定义分辨率\u002FDPI、`--flex-display`、IME 策略、系统装饰；`--start-app` 在虚拟屏上启动应用 |\n\n**投屏过程**\n\n- `POST ...\u002Fcast\u002Fstart` 启动；浏览器连 `WebSocket ...\u002Fcast\u002Fws`\n- 设备端自编译 **scrcpy-server 4.0**（缺 jar 时后端 Gradle 自动编译）；启动前 `pkill` 残留进程，避免 **8886** 占用\n- 参数经 WebSocket **type 101** 热更新（`codecOptions` \u002F stream extras）；投屏中会锁定左侧表单，防止误改\n- 画布触控：坐标按**解码后视频尺寸**映射（与 server `PositionMapper` 一致）；鼠标悬停\u002F按下\u002F拖动\u002F抬起走 scrcpy SDK 协议\n\n**顶栏控制**（图标上图标下文字，Lucide 风格）\n\n- 多任务、主屏幕、返回、关闭屏幕、电源、旋转（同步左侧「预览旋转」+90°）\n- 音量：点击展开「增加 \u002F 减小」\n- 剪贴板：粘贴到设备 \u002F 从设备复制；支持文本输入框发字\n- 截屏：下载 PNG（可不投屏）；投屏时画布四边白光闪烁反馈\n- 录屏：有画面存 **MP4**，仅音频存 **MP3**；结束投屏自动保存\n- **文件管理**、**应用管理**、**终端**：见下文（无需正在投屏）\n\n### 设备工作区 · 摄像头投屏（Android 12+）\n\n![摄像头投屏](images\u002Freadme\u002Fcamera-cast.png)\n\n- 左侧「摄像头」：朝向、摄像头 ID、采集尺寸、宽高比、帧率、高速模式、手电筒、变焦、编码与音频\n- `GET \u002Fapi\u002Fdevices\u002F:serial\u002Fcameras` 列出设备摄像头\n- 投屏中可开关手电、变焦；**摄像头模式不注入画布触摸**（避免误触）\n\n### 文件管理\n\n![文件管理](images\u002Freadme\u002Ffiles.png)\n\n- 根目录 `\u002F`，默认打开 `\u002Fstorage\u002Femulated\u002F0`；地址栏显示真实绝对路径\n- 后退 \u002F 前进 \u002F 向上 \u002F 刷新；无权限时提示「权限不足」\n- **上传**：将本地文件推到当前目录（`PUT ...\u002Ffiles\u002Fupload?path=`）\n- **下载**：将设备上的文件保存到电脑（`GET ...\u002Ffiles\u002Fdownload?path=`）\n- `GET \u002Fapi\u002Fdevices\u002F:serial\u002Ffiles?path=...` 列出目录\n\n### 应用管理\n\n![应用管理](images\u002Freadme\u002Fapps.png)\n\n- 列表：应用名（经 scrcpy-server `PackageManager` 取 label）、包名、系统\u002F冻结标记\n- 详情弹窗：版本、SDK、数据目录等\n- 卸载（二次确认）、用户级冻结\u002F解冻、导出 APK、在文件管理中打开 `dataDir`\n- 本地上传 APK 安装：`PUT ...\u002Fapps\u002Finstall`\n\n### 终端\n\n![终端](images\u002Freadme\u002Fterminal.png)\n\n- xterm.js：Tab、方向键、ANSI 彩色；自动 `stty` 行列\n- `WebSocket ...\u002Fterminal\u002Fws` 桥接 `adb shell -tt`\n\n### 后端与其他\n\n- `GET \u002Fhealth`、`GET \u002Fapi\u002Fdevices`、`GET ...\u002Fscreenshot`\n- scrcpy 会话 API：`\u002Fapi\u002Fscrcpy\u002F*`（能力查询、会话启停，供脚本集成）\n- 工具：`tools\u002Fbuild-scrcpy-server.mjs`、`build-scrcpy.mjs`、`download-scrcpy.mjs`、`sync-scrcpy-source.mjs`、`test-scrcpy-cast.mjs`\n- 已移除 OTG \u002F UHID 投屏模式；当前仅**镜像**与**摄像头**\n\n更细的版本记录见 [CHANGELOG.md](CHANGELOG.md)。\n\n---\n\n## Android 客户端\n\n源码目录：`frontend\u002Fandroid\u002F`。与 Web 共用同一 Node 后端与会话体系，适合在局域网内用手机查看设备画面并全屏操控。\n\n### 连接与登录\n\n- 首次启动配置服务器：**地址**默认为本机网段网关（末段 `.1`，如 `192.168.31.1`），**端口**默认 `3000`\n- 流程与 Web 一致：检测在线 → 首次仍为 `admin` 时强制改密 → 登录；密码经 **EncryptedSharedPreferences** 加密保存，下次自动登录\n- 设置页可 **退出登录** 或 **更换服务器**（清除会话与已保存密码后回到连接页）\n\n### 设备画廊（底部 Tab · 设备）\n\n- 横向设备卡片，展示型号、在线状态与实时截图（默认约 5s 刷新，可在设置中修改）\n- 设备列表约 **1s** 轮询；下拉手动刷新；保留上一帧截图，减少闪烁\n- 右上角 **「+」**：USB 连接引导、无线 **配对码**、**二维码** 配对（对齐 Web「添加设备」）\n- 图标使用 **Community Material**（Android-Iconics），风格与 Web MDI 一致\n\n### 设置（底部 Tab · 设置）\n\n与 Web `SettingsPanel` 分区一致：\n\n| 分区 | 能力 |\n|---|---|\n| **账号** | 密码状态、会话到期、修改密码（底部弹窗）、退出登录 |\n| **外观** | 界面语言（5 种 locale 偏好）、浅色\u002F深色主题（Material3 DayNight） |\n| **刷新** | 设备列表 \u002F 截图刷新间隔（1–120 秒），保存后设备页轮询立即按新间隔运行 |\n| **服务器** | 显示当前 `host:port`，一键更换并重新登录 |\n\n### 设备工作区\n\n- 点击设备卡片进入：顶部返回、设备名、**开始** 按钮\n- **投屏模式**：镜像（默认）\u002F 摄像头（Android 12+）\n- **多标签参数**（与 Web 工作区左侧面板同结构，按设备序列号持久化）：\n  - 镜像：视频、音频、设备、屏幕（含虚拟屏预设 Desktop\u002FMac\u002FiPad 等、`__main__`\u002F`__custom__`、DPI 建议、`start_app` 包名）\n  - 摄像头：摄像头、视频、音频（含 `audioCode`、`bufferMs` 等，流 extra 与 Web 对齐）\n- 修改参数在离开页面时自动保存\n\n### 全屏投屏\n\n- 点击 **开始** 进入横屏全屏：`POST ...\u002Fcast\u002Fstart` + `WebSocket ...\u002Fcast\u002Fws`，**MediaCodec** 解码 H.264，画布 **letterbox** 与预览旋转\n- **镜像模式**：多任务 \u002F 主屏 \u002F 返回 \u002F 电源 \u002F 音量 \u002F 旋转 \u002F 停止；画布触控注入（scrcpy 协议）\n- **摄像头模式**：手电筒、缩小、放大、停止；画布不注入触控\n- 顶栏与底栏 **自动隐藏**（约 3.5s），点击画面切换；进入\u002F退出淡入淡出、直播状态点动画\n- 流参数（`codecOptions`、虚拟屏、`audioDup` SDK 33+ 等）与 Web\u002F桌面端 **同一套规则**\n\n### 构建与安装\n\n**环境**：Android Studio 或 JDK 11+、Android SDK（`minSdk 28`）。\n\n```powershell\ncd frontend\u002Fandroid\n.\\gradlew :app:assembleDebug\n# 产物：app\u002Fbuild\u002Foutputs\u002Fapk\u002Fdebug\u002Fapp-debug.apk\n```\n\n真机需能访问运行后端的局域网地址；HTTP 明文已在 `network_security_config` 中允许（本地开发用）。\n\n### Web 与 Android 能力对照\n\n| 能力 | Web | Android App |\n|---|---|---|\n| 设备画廊 \u002F 截图轮询 | ✅ | ✅ |\n| 设置（账号\u002F外观\u002F刷新） | ✅ | ✅ |\n| 添加设备（USB\u002F配对\u002F二维码） | ✅ | ✅ |\n| 投屏参数工作区 | ✅ | ✅ |\n| 全屏投屏 + 触控\u002F工具栏 | ✅ | ✅ |\n| 文件管理 | ✅ | — |\n| 应用管理 | ✅ | — |\n| ADB 终端 | ✅ | — |\n| 剪贴板 \u002F 录屏 \u002F 浏览器截屏下载 | ✅ | — |\n\n---\n\n## 快速开始\n\n**环境（Web）**：Node.js 18+、已授权 ADB 的 Android 设备、支持 WebCodecs 的 Chromium 系浏览器（Chrome \u002F Edge 等）。\n\n**环境（Android App）**：与后端同一局域网；手机安装 `frontend\u002Fandroid` 构建的 APK（见 [Android 客户端 · 构建与安装](#构建与安装)）。\n\n**自动安装（命令行伪图形向导）**：\n\n| 系统 | 命令 |\n|------|------|\n| Linux（Debian\u002FUbuntu\u002FAlpine\u002FFedora\u002FArch 等） | `bash scripts\u002Finstall-linux.sh` |\n| macOS | `bash scripts\u002Finstall-macos.sh` |\n| Windows | `powershell -ExecutionPolicy Bypass -File scripts\u002Finstall-windows.ps1` |\n| Unix 自动分流 | `bash scripts\u002Finstall.sh` |\n\n```powershell\n# 克隆后\ncd Cloud-Phone\ncopy .env.example .env   # 按需改端口\n\n# 推荐：根目录一键启动（先后端、再前端）\nnpm run dev\n\n# 浏览器打开 http:\u002F\u002Flocalhost:5173（以 .env 中 FRONTEND_PORT 为准）\n```\n\n分开启动：\n\n```powershell\nnpm run dev:backend   # 默认 3000\nnpm run dev:frontend  # 默认 5173\n```\n\n生产预览：\n\n```powershell\ncd frontend\u002Fweb\nnpm run start   # build 后托管 dist\u002F\n```\n\n首次投屏若提示 server 未编译，需 **JDK 17+** 与 Android SDK，执行：\n\n```powershell\nnode tools\u002Fbuild-scrcpy-server.mjs\n```\n\n---\n\n## 目录结构\n\n```text\nCloud-Phone\u002F\n├── scripts\u002F               # 三平台自动安装向导（install-linux\u002Fmacos\u002Fwindows）\n├── backend\u002Fnode\u002F          # Node HTTP + WebSocket API\n├── backend\u002Fsource\u002Fscrcpy\u002F # scrcpy 4.0 源码 + WebSocket 改造\n├── backend\u002Fbin\u002F           # adb、scrcpy 预编译产物\n├── frontend\u002Fweb\u002F          # Vue 3 + Vite + Naive UI（Web 控制台）\n├── frontend\u002Fandroid\u002F      # Android 伴侣 App（设备画廊、设置、全屏投屏）\n├── tools\u002F                 # 构建、同步、开发启动脚本\n├── images\u002Fqr\u002F             # 赞助二维码\n└── CHANGELOG.md\n```\n\n---\n\n## API 摘要\n\n除 `GET \u002Fapi\u002Fauth\u002Fsession`、`POST \u002Fapi\u002Fauth\u002Flogin`、`POST \u002Fapi\u002Fauth\u002Fchange-password` 外，均需先登录（会话 Cookie）。登录后 JSON 请求\u002F响应使用 AES-256-GCM 加密；WebSocket 升级需有效会话；大文件\u002FAPK 上传为 `PUT` 二进制流（仅鉴权，响应 JSON 仍加密）。\n\n| 方法 | 路径 | 说明 |\n|---|---|---|\n| GET | `\u002Fhealth` | 健康检查 |\n| GET | `\u002Fapi\u002Fdevices` | 设备列表 |\n| GET | `\u002Fapi\u002Fdevices\u002F:serial\u002Fscreenshot` | 设备截图 |\n| GET | `\u002Fapi\u002Fdevices\u002F:serial\u002Fmirror-options` | 镜像选项（显示器、应用等） |\n| GET | `\u002Fapi\u002Fdevices\u002F:serial\u002Fvideo-encoders` | 音视频编码器列表 |\n| GET | `\u002Fapi\u002Fdevices\u002F:serial\u002Fcameras` | 摄像头列表 |\n| GET | `\u002Fapi\u002Fdevices\u002F:serial\u002Ffiles?path=` | 目录列表 |\n| GET | `\u002Fapi\u002Fdevices\u002F:serial\u002Ffiles\u002Fdownload?path=` | 下载文件 |\n| PUT | `\u002Fapi\u002Fdevices\u002F:serial\u002Ffiles\u002Fupload?path=` | 上传到设备 |\n| GET\u002FDELETE | `\u002Fapi\u002Fdevices\u002F:serial\u002Fapps` | 应用列表 \u002F 卸载 |\n| GET | `\u002Fapi\u002Fdevices\u002F:serial\u002Fapps\u002F:pkg` | 应用详情 |\n| POST | `\u002Fapi\u002Fdevices\u002F:serial\u002Fapps\u002F:pkg\u002Fstate` | 冻结\u002F解冻 |\n| GET | `\u002Fapi\u002Fdevices\u002F:serial\u002Fapps\u002F:pkg\u002Fapk` | 导出 APK |\n| PUT | `\u002Fapi\u002Fdevices\u002F:serial\u002Fapps\u002Finstall` | 安装 APK |\n| POST\u002FDELETE | `\u002Fapi\u002Fdevices\u002F:serial\u002Fcast\u002Fstart\\|stop` | 投屏会话 |\n| WS | `\u002Fapi\u002Fdevices\u002F:serial\u002Fcast\u002Fws` | 投屏流 + 控制 |\n| WS | `\u002Fapi\u002Fdevices\u002F:serial\u002Fterminal\u002Fws` | ADB Shell |\n| * | `\u002Fapi\u002Fscrcpy\u002F*` | scrcpy 会话与能力（见 `backend\u002Fsource\u002Fscrcpy\u002FCLOUD_PHONE.md`） |\n\n---\n\n## 构建 scrcpy\n\n**Web 投屏**依赖魔改 `scrcpy-server`（与 Windows\u002FLinux\u002FmacOS 无关，但须在任一系统上用 Gradle 编出）：\n\n```powershell\n# 魔改 server（当前系统需 JDK 17+、Android SDK）\nnode tools\u002Fbuild-scrcpy-server.mjs\n\n# 同时写入 backend\u002Fbin\u002Fscrcpy\u002Fwindows|linux|macos\u002F（跨平台部署推荐）\nnode tools\u002Fbuild-scrcpy-server.mjs --all-platforms\n```\n\n**Linux \u002F macOS** 上若只跑 Node 后端 + 浏览器，执行 `--all-platforms` 即可；**不必**在本机再编 scrcpy 客户端。\n\n可选：在本机用 Meson 编译 **scrcpy 桌面客户端**（会捆绑魔改 server，不再使用官方 `install_release.sh`）：\n\n```powershell\nnode tools\u002Fbuild-scrcpy.mjs              # 需 meson + ninja；否则仅编 server\nnode tools\u002Fbuild-scrcpy.mjs --server-only\n\n# 勿用于 Web 投屏：官方预编译，server 无 WebSocket 魔改\n# node tools\u002Fbuild-scrcpy.mjs --download\n```\n\n```powershell\nnode tools\u002Fsync-scrcpy-source.mjs   # 从上游同步源码（需自行合并魔改）\n```\n\n详见 [backend\u002Fsource\u002Fscrcpy\u002FCLOUD_PHONE.md](backend\u002Fsource\u002Fscrcpy\u002FCLOUD_PHONE.md)。\n\n---\n\n## 环境变量\n\n根目录 `.env`（参考 `.env.example`）：\n\n| 变量 | 含义 | 默认 |\n|---|---|---|\n| `HOST` | 监听地址 | `0.0.0.0` |\n| `BACKEND_PORT` | 后端 API | `3000` |\n| `FRONTEND_PORT` | Vite 开发端口 | `5173` |\n\n\n\n---\n\n## 致谢\n\nCloud Phone 站在很多优秀项目肩上，特此感谢（排名不分先后）：\n\n| 项目 | 用途 | 链接 |\n|---|---|---|\n| **scrcpy** | 屏幕\u002F摄像头采集、编码、控制的核心；本仓库 `backend\u002Fsource\u002Fscrcpy` 在其 4.0 上扩展 WebSocket | https:\u002F\u002Fgithub.com\u002FGenymobile\u002Fscrcpy |\n| **ws-scrcpy** | 浏览器 WebSocket 线协议（`scrcpy_initial`、Annex-B H.264、type 101 等）参考 | https:\u002F\u002Fgithub.com\u002FNetrisTV\u002Fws-scrcpy |\n| **escrcpy** | 镜像参数分组与选项命名习惯的参考（非代码依赖） | https:\u002F\u002Fgithub.com\u002Fviarotel-org\u002Fescrcpy |\n| **Vue** | 前端框架 | https:\u002F\u002Fgithub.com\u002Fvuejs\u002Fcore |\n| **Vite** | 构建与开发服务器 | https:\u002F\u002Fgithub.com\u002Fvitejs\u002Fvite |\n| **Naive UI** | 组件库 | https:\u002F\u002Fgithub.com\u002Ftusen-ai\u002Fnaive-ui |\n| **xterm.js** | 终端模拟 | https:\u002F\u002Fgithub.com\u002Fxtermjs\u002Fxterm.js |\n| **lamejs**（@breezystack\u002Flamejs） | 投屏录屏 MP3 编码 | https:\u002F\u002Fgithub.com\u002Fbreezystack\u002Flamejs |\n| **ws** | Node WebSocket | https:\u002F\u002Fgithub.com\u002Fwebsockets\u002Fws |\n| **Java-WebSocket** | 设备端 WebSocket（scrcpy-server 依赖） | https:\u002F\u002Fgithub.com\u002FTooTallNate\u002FJava-WebSocket |\n| **Android platform-tools** | 内置 ADB | https:\u002F\u002Fdeveloper.android.com\u002Ftools\u002Freleases\u002Fplatform-tools |\n\n浏览器侧还用到 **WebCodecs**、**Web Audio** 等标准 API。\n\nscrcpy 本体遵循 **Apache License 2.0**（见 `backend\u002Fsource\u002Fscrcpy\u002FLICENSE`）。若你发现遗漏了应署名的依赖，欢迎提 Issue。\n\n---\n\n## 赞助\n\n如果 Cloud Phone 帮你省了时间，欢迎请我喝杯咖啡。扫码即是对项目的认可，金额随意。\n\n\u003Ctable align=\"center\">\n\u003Ctr>\n\u003Ctd align=\"center\">\u003Cb>微信\u003C\u002Fb>\u003Cbr\u002F>\u003Cimg src=\"images\u002Fqr\u002Fwx.jpg\" width=\"220\" alt=\"微信赞助二维码\"\u002F>\u003C\u002Ftd>\n\u003Ctd align=\"center\">\u003Cb>支付宝\u003C\u002Fb>\u003Cbr\u002F>\u003Cimg src=\"images\u002Fqr\u002Fzfb.png\" width=\"220\" alt=\"支付宝赞助二维码\"\u002F>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n赞助自愿、非商业捆绑；项目仍完全开源，不影响你自行部署使用。\n\n---\n\n\n## Star History\n\n\u003Ca href=\"https:\u002F\u002Fwww.star-history.com\u002F?repos=yiyifred%2FCloud-Phone&type=date&legend=top-left\">\n \u003Cpicture>\n   \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fchart?repos=yiyifred\u002FCloud-Phone&type=date&theme=dark&legend=top-left\" \u002F>\n   \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fchart?repos=yiyifred\u002FCloud-Phone&type=date&legend=top-left\" \u002F>\n   \u003Cimg alt=\"Star History Chart\" src=\"https:\u002F\u002Fapi.star-history.com\u002Fchart?repos=yiyifred\u002FCloud-Phone&type=date&legend=top-left\" \u002F>\n \u003C\u002Fpicture>\n\u003C\u002Fa>\n","Cloud Phone 是一个用于手机在线屏幕镜像的项目。它通过WebSocket将H.264编码的视频流推送到浏览器，并利用WebCodecs进行硬件解码，支持触摸和鼠标操作。项目基于scrcpy 4.0自编译版本，提供了丰富的参数设置选项，如裁剪、采集方向、虚拟屏预设等，同时具备文件管理、应用管理和ADB终端等功能。适用于需要在浏览器中统一管理多台Android设备的开发者或用户，特别是那些希望在不启动投屏的情况下也能执行文件传输、应用安装及日志查看等任务的人士。此外，还提供了一个配套的Android应用，方便用户在手机上查看设备列表并进行全屏投屏控制。",2,"2026-06-11 04:07:19","CREATED_QUERY"]