HOScrcpy鸿蒙远程真机工具上手:5分钟把鸿蒙设备画面搬上电脑,还能反向操控
【免费下载链接】鸿蒙远程真机工具该工具主要提供鸿蒙系统下基于视频流的投屏功能,帧率基本持平真机帧率,达到远程真机的效果。项目地址: https://gitcode.com/OpenHarmonyToolkitsPlaza/HOScrcpy
你是不是也遇到过这样的尴尬:手机明明就在工位,可一上午被同事借去调试,你想看一眼页面状态却连设备都摸不着;或者你在北京写代码,真机却放在深圳的机房里,每次改一行 UI 都要远程求人截图。传统做法是接根 USB 线老老实实坐在设备旁边,但鸿蒙远程真机工具 HOScrcpy给了你第二条路——基于视频流把设备画面实时搬到电脑上,帧率基本持平真机帧率,点哪儿设备跟着动哪儿,延迟控制在 100 毫秒以内。
读完这篇文章,你会知道 HOScrcpy 能做什么、桌面版怎么一键投屏、SDK 怎么用三行代码接入自己的项目,以及网页端如何让投屏脱离电脑桌面。全程不烧脑,跟着步骤走就行。
先想清楚:HOScrcpy 到底是解决什么问题的
一句话:HOScrcpy 是一个基于视频流方案的 HarmonyOS NEXT 设备投屏工具,核心价值是"远程真机"——设备不在手边,也能像坐在它面前一样看画面、点屏幕、按按键。
它面向两类人:
- 鸿蒙应用开发者:调试 UI、跑自动化测试、排查问题,不用守着设备
- 团队或机房运维:把一批鸿蒙设备集中部署,开发者远程共享,提高设备利用率
为了让你直观感受它的价值,我们把传统方案和 HOScrcpy 摆在一起对比:
| 对比项 | 传统 USB 直连调试 | HOScrcpy 远程真机 |
|---|---|---|
| 设备位置 | 必须在身边 | 本地或异地机房均可 |
| 多人共享 | 一次一人独占 | 多开发者共享同一台设备 |
| 画面实时性 | 依赖厂商工具 | 视频流采集,帧率持平真机 |
| 操作反控 | 部分工具支持 | 触摸、鼠标、滚轮、虚拟按键全支持 |
| 二次开发 | 通常闭源接口 | 提供完整 Java API 和网页 demo |
说白了,HOScrcpy 把"投屏"从"本地演示功能"升级成了"远程真机基础设施"。接下来我们分两条路走:先看开发者最关心的SDK 三行代码接入,再看普通用户开箱即用的桌面工具。
三行代码接入视频流投屏:HosRemoteDevice 入门示例
HOScrcpy 把核心能力封装在com.huawei.hosscrcpy.api包下,对开发者暴露三个类:HosRemoteDevice(设备对象)、ScreenCapCallback(视频流回调)、HosRemoteConfig(性能配置)。Java 8 及以上版本即可使用。
一个最简的投屏示例长这样:
import com.huawei.hosscrcpy.api.HosRemoteDevice; import com.huawei.hosscrcpy.api.ScreenCapCallback; import java.nio.ByteBuffer; // 1. 通过设备 SN 号创建设备对象 HosRemoteDevice device = new HosRemoteDevice("设备SN号"); // 2. 注册回调,开始拉取视频流并开启实时反控 device.startCaptureScreen(new ScreenCapCallback() { @Override public void onData(ByteBuffer byteBuffer) { // 拿到 H.264 视频流数据,喂给解码器或播放器渲染 } @Override public void onReady() { // 视频流就绪,可以执行触摸/按键注入 device.onTouchDown(100, 200); // 模拟手指按下 device.onTouchUp(100, 200); // 模拟手指抬起 } @Override public void onException(Throwable throwable) { // 拉流失败,在这里处理异常 } });代码很直白:onData负责收画面,onReady负责告诉你"可以开始操作了"。这里有个容易踩的坑,值得单独提醒:如果设备已经亮屏且画面静止,onData可能不会被调用,因为视频流只在画面变动时才产生。所以官方在onReady里习惯性地"动一下"设备(比如注入一次触摸事件)来触发画面刷新——这也是很多人在第一次接入时发现画面黑屏的真正原因。
拿到这段代码,你就已经具备了自建鸿蒙远程真机平台的基础。但如果你只想快速用起来、不想写界面,那就直接看下一节。
桌面版免开发直接投屏:三步走完从构建到连接
HOScrcpy 自带的桌面工具基于 Java Swing 实现,已经内置了 H.264 解码、画面渲染、按键面板和控件树,拿到就能用。
第一步:获取并构建项目
git clone https://gitcode.com/OpenHarmonyToolkitsPlaza/HOScrcpy.git cd HOScrcpy mvn clean package如果你更习惯 IDEA,也可以在 IDE 里通过"工件(Artifact)"配置打包,构建完成后产物会输出到out目录下的HOScrcpy_jar文件夹,里面所有 jar 运行时都会用到。
第二步:启动主程序
启动前请确认系统环境变量里已配置JAVA_HOME(注意不用包含 bin 目录)。然后在 jar 所在目录执行:
java -jar HOScrcpy.jar -cp MainWindows 用户可以直接运行release/win_start.bat,macOS 用户对应release/mac_start.sh。
第三步:连设备、进投屏
打开界面后,点"刷新设备"拉取已连接的鸿蒙设备列表,选中你的设备,点"进入投屏",稍等片刻画面就出来了。界面右侧还集成了电源键、音量加/减、返回键等虚拟按键,相当于把手机的物理按键搬到了电脑上。
到这里,你已经完成了"把鸿蒙设备画面搬上电脑"这件最初的事。但真正的远程真机体验,取决于参数调得好不好——下一节我们聊聊性能配置。
帧率码率缩放怎么调:HosRemoteConfig 性能调优指南
HOScrcpy 允许你通过HosRemoteConfig精细化控制视频流质量,所有参数都有默认值,按需覆盖即可:
| 配置方法 | 默认值 | 说明 |
|---|---|---|
setScale(int) | 原图 | 分辨率缩放,传 2 表示取 1/2、3 表示 1/3,最大 5 |
setFrameRate(int) | 120FPS | 视频流帧率 |
setBitRate(int) | 30M | 视频流码率 |
setPort(int) | 5000 | 设备侧视频流转发端口 |
setIFrameInterval(int) | 2000ms | I 帧间隔,影响首帧出画速度 |
setHdcPath(String) | 自动探测 | 指定 hdc 可执行文件完整路径 |
HosRemoteConfig config = new HosRemoteConfig("设备SN号"); config.setScale(2); // 分辨率取原图的 1/2 config.setFrameRate(60); // 帧率 60fps config.setBitRate(20); // 码率 20Mbps config.setIFrameInterval(1000);// I 帧间隔 1 秒 HosRemoteDevice device = new HosRemoteDevice(config); device.startCaptureScreen(callback);不同场景的取舍建议:
- 开发调试:高帧率 + 低缩放,追求操作跟手,肉眼看到的和真机几乎一致
- 远程演示:中等帧率 + 中等缩放,流畅度够用,网络占用也低
- 弱网环境:低帧率 + 大缩放倍数,先把画面"传得动"放在第一位
记住一个原则:帧率和码率不是越高越好,它们和你的网络带宽是此消彼长的关系,找到平衡点才是远程真机的正确打开方式。
视频流还是图片流?两种投屏模式怎么选
看到这里你可能发现,HOScrcpy 还提供了startImageScreenCapture这套图片流接口。没错,桌面工具本身就在投屏失败时自动降级到图片流模式。两种模式各有取舍:
| 维度 | 视频流(默认) | 图片流 |
|---|---|---|
| 数据格式 | H.264 编码 | JPEG 图片 |
| 流畅度 | 帧率持平真机,丝滑 | 画面刷新依赖设备变动 |
| 网络开销 | 低(编码压缩后小) | 相对更高 |
| 适用场景 | 常规投屏、反控 | 视频流拉取失败的兼容方案 |
用法上两者几乎一致,只是回调里拿到的数据一个是视频帧、一个是图片字节流(可直接用ImageIO.read转成BufferedImage渲染)。如果你在部分系统版本上遇到视频流拉不起来(比如报can not find scrcpy pid),图片流就是那个"兜底方案"。
控件树查看与 Layout 导入导出:自动化测试的"照妖镜"
HOScrcpy 桌面版另一个实用能力是控件元素查看。进入投屏后点击"控件查看",工具会调用getLayout()获取当前页面的 UI 结构 JSON,并在右侧以树形展示所有控件。
点击任意控件节点,左侧画面会用红框标出它的位置,右侧列出它的text、type、position、xpath等属性。这个功能对两类人特别有用:
- UI 自动化测试:先看控件结构,再照着
xpath或坐标写用例,不用再猜控件 ID - 布局排查:哪个控件超出了屏幕、哪个文案重叠了,点一下就看得明明白白
更贴心的是,菜单里还提供了Layout 导入/导出。你可以把某页面的结构 JSON 和截图导出保存,之后即使设备不在身边,也能拖入 JSON + 图片离线复盘页面结构——对跨团队协作排查线上 UI 问题非常实用。
让网页也能投屏:WebSocket 版远程真机 demo 三连
HOScrcpy 不满足于桌面端,web_demo模块展示了如何在浏览器里查看和控制设备。原理很简单:本地起一个 WebSocket 服务端承载投屏服务,网页端通过 WebSocket 接收视频流并渲染,同时把鼠标事件回传设备。
第一步:启动 WebSocket 服务,直接运行MyWebSocket.java的main方法,服务默认监听 8899 端口。
第二步:改页面里的设备 SN,打开resources/html下的h264.html,把第 31 行socketUrl末尾的"设备sn"替换成你自己的设备序列号:
var socketUrl = "ws://127.0.0.1:8899/127.0.0.1/你的设备SN";第三步:浏览器打开h264.html,稍等片刻即可看到投屏画面,鼠标在 video 区域按下、拖动、松开,对应的触摸事件就会通过 WebSocket 注入到设备上。
网页端实现的核心就一句话:ws.onmessage收到二进制数据后,交给JMuxer解码渲染到<video>标签;鼠标事件则通过{"type":"touchEvent", ...}的消息格式回传。整个 demo 思路清晰,适合想自建 Web 版远程真机平台的团队直接参考。这里同样有个小提示:画面静止时不会自动刷新,想看效果先滑动一下手机。
常见坑位与解决思路
根据项目资料和社区反馈,把最高频的几个问题整理如下:
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 刷新不到设备 | 设备 USB 调试未开启 | 开启开发者选项和 USB 调试后重试 |
| 投屏画面迟迟不出 | 设备静止,无新画面产生 | 参考onReady的用法,先注入一次触摸 |
| 视频流拉取失败 | 系统版本不兼容 | 确认 SDK 版本与系统匹配,或切换图片流模式 |
| 鼠标拖拽不生效 | 设备 uitest 版本过低 | 升级系统版本;低版本仅支持左右键单击 |
| 远程设备连不上 | 未添加远程 IP | 在"管理远程 IP"中添加设备所在主机 IP |
其中 SDK 版本兼容性要特别留意:老版本系统需要1.0.0-beta,新版系统用1.0.1-beta之后的版本;1.0.4-beta还专门修复了 5.0.0.71 版本无法投屏的问题。接入前先对照一下设备系统版本。
下一步行动清单:从读到用只差三步
到这里,HOScrcpy 的全貌你已经清楚了。如果你也想体验远程真机的感觉,按下面三步走:
- 先跑桌面版:克隆项目、
mvn clean package、启动,连上你的鸿蒙设备,先感受一下"帧率持平真机"的流畅度 - 再试网页版:跑起
web_demo,把投屏从桌面搬到浏览器,理解 WebSocket 的完整链路 - 最后接入自己的系统:按上文的三行代码示例封装 SDK,把投屏、反控、Layout 导出这些能力整合进你的测试平台或运维系统
HOScrcpy 作为开源项目,还在持续迭代:帧率码率配置、HDC 路径指定、I 帧间隔调节、图片流、鼠标注入……这些能力都是一步步从真实使用场景里长出来的。如果你在接入过程中踩了新坑、或者有更好的想法,欢迎在项目仓库提交 Issue 或 Pull Request——远程真机这件小事,值得更多人一起把它做好。
现在,打开电脑连上设备,HOScrcpy 已经在等你了。
【免费下载链接】鸿蒙远程真机工具该工具主要提供鸿蒙系统下基于视频流的投屏功能,帧率基本持平真机帧率,达到远程真机的效果。项目地址: https://gitcode.com/OpenHarmonyToolkitsPlaza/HOScrcpy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考