简介:这是一套针对Android手机投屏场景的QtScrcpy软件资源包。该开源工具无需root权限即可将手机屏幕实时同步至电脑,有效解决跨设备屏幕共享不便的问题,适合移动开发调试、演示汇报、游戏直播等场景,同时支持USB数据线与TCP/IP网络两种连接方式,兼容Windows、Linux和macOS三大操作系统,覆盖面广。压缩包内共34个文件,总体积44.42MB,主要包含exe可执行程序、dll动态链接库、json配置文件、ini设置项以及scrcpy-server服务组件。其中exe负责启动软件主程序,dll为运行所需的依赖库,json文件提供按键映射或应用配置,整个工具包解压后即可直接运行,无需额外安装环境。目前已有22346人学习该资源。这份资源可让普通用户或开发者免去手动编译的麻烦,直接获得完整投屏工具链。配合内置的adb与scrcpy-server组件,可实现高清晰度、低延迟的屏幕镜像;通过映射配置还能使用键鼠控制手机,便于演示、调试或游戏操作,整体易用且高效。
1. QtScrcpy 手机投屏:为什么我留下这个解压包而不是用其他投屏工具
有一次做移动端调试,手机屏幕要投到电脑上给同事演示,又要在电脑端直接操作应用,试了几个工具要么要求 root,要么延迟高得没法看。QtScrcpy 手机投屏是这个场景下少有的「免 root + USB/WiFi 双模式 + 键鼠反向控制」的开源工具,win-x64-v1.8.1 解压即用,不需要在手机上装客户端,也不需要电脑上有安卓模拟器。它适合三类人:普通用户想在大屏上看手机视频、主播直播手机游戏画面、开发者需要频繁在电脑上调试 Android 应用。我把它拆过一遍后,把依赖文件、adb 命令和 keymap 配置都摸清楚了,这篇笔记就是整个拆解过程。
2. 安装与连接:从解压 QtScrcpy-win-x64-v1.8.1 到手机出现画面
这套资源不是单文件绿色版,解压后你会看到 QtScrcpy.exe、scrcpy-server、adb.exe、一堆 dll 以及 keymap 目录。如果只把 QtScrcpy.exe 拷到桌面,双击大概率会报错「找不到 Qt5Core.dll」或「无法定位程序输入点」。所以第一步不是连手机,而是先搞懂目录里每个文件在干什么。
2.1 先看懂解压目录:dll、server 和 keymap 各自管什么
QtScrcpy 的目录结构看着吓人,其实可以分成四类:主程序、Android 端服务、adb 工具链、Qt 运行库。用表格列一下关键文件:
| 文件 / 目录 | 作用 | 说明 |
|---|---|---|
| QtScrcpy.exe | 主程序,Qt5 界面 | 依赖同目录下的 dll,不能单独移动 |
| scrcpy-server | 投屏服务端,运行在手机上 | 负责屏幕采集和 H.264 编码 |
| adb.exe / AdbWinApi.dll / AdbWinUsbApi.dll | Android 调试桥 | 负责识别设备、传输数据流 |
| avcodec-58.dll / avformat-58.dll / swscale-5.dll / swresample-3.dll | FFmpeg 运行时 | 解码 H.264 视频流,做图像缩放 |
| Qt5Core.dll / Qt5Gui.dll / Qt5Widgets.dll 等 | Qt5 基础库 | 界面渲染、窗口管理、网络通信 |
| imageformats / platforms / styles / bearer | Qt 插件目录 | qjpeg.dll、qwindows.dll 都在这,缺了会闪退 |
| keymap / | 按键映射配置 | tiktok.json、gameforpeace.json 等,后面细说 |
| config.ini | 全局配置 | 保存设备序列号、分辨率、码率等 |
这些 dll 看着多,实际上都是免安装运行库,不需要手动注册。如果某个 dll 缺失,大概率是解压被杀毒软件静默隔离了,或者解压工具没还原完整目录。我一般解压后会先确认两个地方:platforms目录里有qwindows.dll,imageformats目录里有qjpeg.dll,再双击 exe,基本不会在初始化阶段翻车。
核心文件是scrcpy-server。QtScrcpy 启动投屏时,会把这个服务推到手机上,然后手机端用 MediaCodec 硬编码屏幕画面,通过 adb 建立的通道传回电脑,电脑端再用 FFmpeg 解码。所以「投屏」不是一张张传截图,而是一条持续的视频流,这也是它低延迟的底气。
2.2 USB 连接:开启 USB 调试,用 adb devices 确认设备
USB 连接是最稳的方式。第一次操作按下面几步走:
- 在手机上打开「开发者选项」:设置 → 关于手机 → 连点「版本号」七次,直到提示已进入开发者模式。
- 进入开发者选项,打开「USB 调试」,顺便把「通过 USB 安装应用」也打开。
- 用数据线连接电脑,手机上把连接模式选为「传输文件 / MTP」,不要选「仅充电」。
- 双击 QtScrcpy.exe,点击「刷新」设备列表,选中设备后点「启动配置」。
如果设备列表里没出现,先不要折腾软件,直接在命令行验证 adb 能不能看到设备。在解压目录打开 PowerShell 或 cmd,执行:
# 在解压目录打开命令行,确认 adb 能看见设备 .\adb.exe devices -l这条命令会列出当前所有连接到电脑的 Android 设备。-l参数会显示设备型号和传输方式,比如usb:3386900X product:samsung,能帮你区分两台同型号手机。输出第二列是设备状态:device表示正常可用,unauthorized表示手机上没确认授权,offline表示连接不稳定或 adb 服务异常。
如果显示 unauthorized,解锁手机,在弹窗里勾选「始终允许使用这台计算机进行调试」,点允许。如果列表完全为空,先换一根数据线、换一个 USB 口,再到设备管理器里看有没有带感叹号的 Android 设备。QtScrcpy 不需要手机装客户端,也不需要 root,但需要系统能正确识别你的手机驱动,这一步绕不开。
2.3 无线连接:adb tcpip 和 adb connect 参数与坑
USB 线用久了总归不方便,尤其是手机要拿起来操作时。无线模式也走 adb,只是把 USB 通道换成 TCP。先在 USB 连接状态下给手机开好 TCP 监听端口:
# 告诉手机开启 TCP 监听 5555 端口,-s 指定设备序列号 .\adb.exe -s <设备序列号> tcpip 5555 # 断开 USB 后,在电脑上通过局域网 IP 连接手机 .\adb.exe connect 192.168.1.100:5555第一条命令里的-s是 serial 的缩写,后面跟设备序列号,作用是防止多台设备连接时 adb 不知道该操作谁。5555是 adb 默认的调试端口,一般不用改。第二条命令里的192.168.1.100要换成手机在局域网里的实际 IP,手机可以从 WiFi 设置里看到。连接成功后同样用adb devices验证,状态应该是device,之后在 QtScrcpy 里点刷新,就能看到一个 IP 地址开头的设备。
无线连接有个前提:手机和电脑必须在同一局域网。Android 11 及以上的系统,还可以在开发者选项的「无线调试」里直接扫码配对,QtScrcpy 自带的 adb 也支持adb pair配对流程,尤其适用于手机不插 USB 的情况。配对命令大概是adb pair 192.168.1.100:37000,端口号和配对码在手机无线调试页面会实时显示,输错就重新来。
无线模式的两个典型坑,这里先预告一下:一是手机休眠时间长了,adb 连接会自动断开,重新执行一次adb connect就能恢复,不用重新配;二是电脑重启后,adb server 可能因为端口占用或缓存异常连不上旧设备,先执行adb kill-server再adb start-server,十有八九能解决。这两条在第 5 章还会展开说。
3. 画质与延迟调参:分辨率、码率、帧率的设置逻辑
连接上之后,默认参数在 USB 模式下问题不大,但切到无线后画面容易糊、延迟忽高忽低。QtScrcpy 的设置面板里能直接改分辨率、码率和帧率,改完重新启动投屏就生效。不过乱改不如知道这些参数之间的制约关系。
3.1 视频链路:为什么 H.264 编码与 USB 传输决定了延迟
QtScrcpy 的投屏链路是固定的:手机端 MediaCodec 硬编码屏幕画面,输出 H.264 流;这条流通过 adb 建立的本地 socket 传回电脑;电脑端用 FFmpeg 解封装、解码;最后 Qt 把每一帧渲染到窗口里。延迟就是编码耗时、传输耗时、解码耗时三者相加,任何一环压力大都会卡顿。
USB 2.0 的实际有效带宽大概在每秒 30 到 40MB,WiFi 5G 的吞吐理论上更高,但无线受信道干扰和距离影响很大。所以码率设置过高时,无线模式下先出现花屏,然后是延迟飙升;分辨率设置过高时,手机编码器压力大,发热降频后实际帧率反而更低。很多时候不是 QtScrcpy 不够快,而是手机编码器和网络通道吃满了。
一个常见误用是把「分辨率越高越好」带到投屏里。对低延迟场景来说,720p 和 1080p 的延迟差距肉眼可感,但清晰度差距没有想象中大,因为手机屏幕本身也就那么大。调试 App 时我通常把分辨率压到 1280 以下,点按跟手程度会明显提升。
3.2 设置面板里的参数:分辨率、码率、帧率怎么配合
QtScrcpy 的设置面板里有几项直接影响视频质量:视频分辨率、视频码率、视频帧率、传输速率。给一组我常用的参考值:
| 使用场景 | 分辨率 | 码率 | 帧率 | 连接方式 |
|---|---|---|---|---|
| 日常演示 | 手机原始或 1920x1080 | 4Mbps | 30 | USB / WiFi |
| 游戏直播 | 1280x720 | 8Mbps | 60 | USB |
| 移动开发调试 | 1280x720(或原始) | 4Mbps | 30 | USB |
| 纯看视频 | 1920x1080 | 6Mbps | 60 | WiFi |
码率单位在设置面板里一般显示为 kbps,所以 4Mbps 对应的就是 4096。分辨率不要设超过手机原始分辨率,否则手机端要先缩放,反而多一道处理。帧率不是越高越好,绝大多数手机屏幕是 60Hz,投屏到 60fps 已经是上限;如果电脑显卡解码能力一般,开到 60fps 反而会让渲染线程跟不上,鼠标操作出现掉帧感。
执行操作就三步:先打开设置面板,把视频码率改成 4096;然后分辨率选 1080p 或保持默认;最后确认帧率选的 30。无线投屏时我会顺手把音频关掉,少一条数据流就少一份卡顿。改完点应用,停止当前投屏再重新启动,参数就会按新配置跑。
3.3 窗口缩放、录屏和方向控制:菜单里的实用开关
投屏窗口不要随手拉大拉小。窗口如果和视频流分辨率不成比例,QtScrcpy 会用非整数倍缩放,画面边缘出锯齿,鼠标点击坐标也会开始飘。我一般用菜单里的「适应窗口」或「保持比例」,让它自动算,而不是手动把窗口拖成奇怪的长方形。
录屏功能值得单说。它把解码后的画面直接写入 mp4,相当于软件内部录了一遍。好处是省掉额外装录制软件,坏处是码率不够时录出来的文件也是糊的。如果是重要演示,我一般优先用 OBS 采集窗口,画面质量由你屏幕上的实际输出决定,不受投屏码率限制。
横竖屏切换在操作大型游戏时比较常用。QtScrcpy 菜单里有旋转按钮,点一下会通过 adb 切换手机屏幕方向,不用起身去手机上转。这个动作实际上执行的是wm user-rotation一类的系统命令,手游对战类 App 里慎用,一旦 App 自己锁了方向,系统指令可能被忽略。
如果你希望每次启动都用同一套参数,可以直接改资源根目录的 config.ini。常见字段是设备序列号、分辨率、码率、帧率,样式类似下面这样:
[device] serial= [display] width=0 height=0 max_size=1920 video_bitrate=4000 max_fps=30width和height为 0 时表示使用手机原始分辨率;max_size限制编码时的最大边长,比如 1920 表示最长边不超过 1920;video_bitrate单位是 kbps;max_fps限制帧率。改这个文件有个小坑:保存时编码必须是 UTF-8,不要带 BOM,否则 Qt5Core 读配置时可能把第一行解析出乱码,导致整个配置失效。
4. 反向控制与按键映射:keymap 里的 json 是干什么的
投屏看画面只是基础功能,真正让人觉得「反客为主」的是键鼠反向控制。QtScrcpy 默认模式下,鼠标点击等于手指点击,键盘输入等于手机键盘输入。但到了游戏这类需要虚拟摇杆的场景,鼠标拖拽不如键盘按键稳,于是就有了 keymap 目录下的按键映射配置。
4.1 反向控制原理:adb 注入点击事件
反向控制的技术原理并不神秘。电脑端收到鼠标键盘事件后,QtScrcpy 会把它编码成控制消息,通过已经建立的 adb 通道发给手机上的 scrcpy-server,再由 server 注入到系统输入层。由于走的是系统级输入通道,手机不需要 root,也不需要额外装输入法或模拟器控件。
为什么普通鼠标操作够用了,还要按键映射?因为虚拟摇杆和射击按钮天然适合键盘操作。用鼠标模拟摇杆,你需要按住鼠标左键并保持不动,松手就等于抬起,这对游戏里的走位是很致命的;而按键映射可以把「W 按下」持续映射为「摇杆中心位置有手指按住」,手指不松开,摇杆就一直生效,按键手感更接近真实电竞场景。
4.2 认识 keymap 目录:tiktok.json、FRAG.json、gameforpeace.json 里有什么
解压出来后,keymap 目录里已经有几个现成配置:identityv.json 对应《第五人格》,tiktok.json 对应抖音 / TikTok 的滑屏操作,gameforpeace.json 对应《和平精英》国际服,FRAG.json 对应 FRAG Pro Shooter 这类射击游戏,test.json 则是测试模板。这些 json 不是 QtScrcpy 的固定代码,而是按键映射的预设,你可以直接抄来用,也可以照着改。
打开一个 json 会看到类似下面这种结构,这里用 test.json 的常见字段做示意:
{ "keys": [ { "key": "w", "action": "down", "x": 300, "y": 500, "width": 200, "height": 200 }, { "key": "space", "action": "click", "x": 900, "y": 600, "width": 150, "height": 150 } ] }字段含义:key是键盘键名,比如 w、space、a、d;action是触发方式,down表示按键按下时触发一次按下,up表示松开键盘时触发一次抬起,click表示单击;x和y是屏幕热区左上角的像素坐标;width和height是热区尺寸。按键按下后,QtScrcpy 会在热区中心位置模拟一次触摸按下,松开键盘时再在同一个位置模拟抬起,所以热区可以设置得比按钮大一点,方便盲按。
需要提醒的是,不同版本的 QtScrcpy 对 keymap json 的字段解析可能略有差异。我一般不会从零写,而是先复制一个内置配置,保留它的顶层结构,只改 key 和坐标,这样能避开字段名对不上的问题。
4.3 自建映射:用 test.json 做底,按截图坐标改键位
想要在某个游戏里用键盘操作,最靠谱的流程是先截一张手机屏幕,把按钮坐标量出来,再填进 json。步骤如下:
- 在 keymap 目录复制 test.json,改名成 mygame.json。
- 把手机截图传到电脑:
# 用 adb 直接截屏,并把 PNG 保存到当前目录 adb.exe exec-out screencap -p > screen.pngexec-out的作用是直接执行命令并输出原始数据,不走 shell 交互;screencap -p是 Android 系统自带的截屏命令,指定输出 PNG 格式。这个命令不需要 root,但要求手机亮屏且解锁。如果输出的 screen.png 是 0 字节,先检查 adb 设备是否正常,再确认手机是否设置了锁屏密码阻挡截屏。
- 用电脑上的画图或截图工具打开 screen.png,读取目标按钮的像素坐标,比如开火键中心大概在 x=900、y=600。
- 把坐标换算到投屏分辨率。这一步容易漏:如果手机实际分辨率是 2400x1080,截出来的图就是 2400x1080,而投屏分辨率如果被 QtScrcpy 限制到 1920x1080,json 里的坐标也会跟着等比缩放。换算公式是
实际X = 图上X × 投屏宽 / 截图宽,不要按窗口大小来算。 - 把换算后的坐标填入 mygame.json,保存。
- 在 QtScrcpy 的按键映射菜单里选择 mygame.json,重新启动投屏。
按键映射最容易翻车的地方就是坐标基准不统一。我现在的习惯是先把投屏分辨率固定在 1920x1080,所有 json 都按这个分辨率写,换手机也只改截图不重算坐标。如果按下去没反应,先检查action是不是写成了 click 而实际需要 down + up;如果方向错或按的位置偏,检查坐标是不是超出屏幕范围,超出屏幕的注入会被系统直接丢弃,不会报任何错。
5. 投屏实战避坑:QtScrcpy 常见问题与排查
用这个软件最烦的不是功能不会用,而是插上线之后设备列表一片空白,或者图像投出来了但操作失灵。这里按「现象 → 原因 → 解决」的格式,把踩过的坑整理成清单,排查顺序建议是先命令行确认 adb 设备,再确认权限,再查配置,最后才怀疑软件版本。
5.1 设备识别与 adb 权限问题
现象:插上手机后 Windows 提示「无法识别的 USB 设备」,QtScrcpy 设备列表为空。 原因:最常见的是 USB 接口供电不足,或者数据线只支持充电不支持数据传输,也有可能是系统里的 Android 驱动被更新成了错误的厂商驱动。 解决:换到主板后置 USB 口,优先 USB 2.0 口;换一根支持数据传输的原装线;打开设备管理器,找到带感叹号的 Android Device,右键更新驱动,选「自动搜索」;如果还是不行,去手机厂商官网下载对应 USB 驱动手动装。
现象:adb devices 显示 unauthorized,但手机明明点了允许。 原因:手机弹窗里的「始终允许使用这台计算机进行调试」没有勾选,或者电脑上的 adb 公钥信息出了问题。 解决:在命令行执行
adb kill-server,删除用户目录下.android/adbkey和adbkey.pub两个文件,重新插线;手机端也可以到开发者选项里撤销 USB 调试授权,重新弹窗再授权一次。现象:连接成功,但 QtScrcpy 提示「server 启动失败」或「scrcpy-server 不存在」。 原因:解压目录不完整,scrcpy-server 被杀毒软件隔离成 0 字节,或者解压工具没把文件名还原对。 解决:把整个解压目录加入杀毒软件白名单,重新解压一次,确认根目录下的 scrcpy-server 文件的体积不是 0 字节;如果杀毒软件仍报毒,可以把 scrcpy-server 单独排除,再手动放行。
现象:电脑上连着两台手机,QtScrcpy 总是自动连到上一台旧设备。 原因:config.ini 的
[device] serial=里保存了旧的设备序列号,启动时优先用了这个值。 解决:先在设备列表里刷新,确认当前目标设备的序列号;然后打开 config.ini,把[device]下面的serial=改成目标设备序列号,或者直接清空让 QtScrcpy 重新识别。
5.2 画面、延迟和按键映射问题
现象:无线投屏延迟忽高忽低,鼠标点击有明显滞后。 原因:手机和电脑连的是同一台路由器的 2.4G WiFi,周边信号干扰严重;或者电脑睡眠唤醒后 adb 通道实际已经断了,QtScrcpy 还显示旧画面。 解决:必须用无线时,把手机和电脑都切到 5G 频段;在 QtScrcpy 里把码率从 8000 降到 4000,分辨率降到 1080p,帧率保持 30;如果延迟依旧明显,回到 USB 模式排查,USB 下正常就说明是网络环境问题,不是软件问题。
现象:游戏里按键映射坐标错位,按下 W 却触发了屏幕左上角区域。 原因:json 里的坐标基准和当前投屏分辨率不一致。QtScrcpy 窗口被手动缩放不影响坐标,但投屏视频流本身的分辨率变了,坐标没有等比换算,热区就偏了。 解决:先固定投屏分辨率,比如统一 1920x1080;再做一次截图,把游戏实际画面和 json 热区标注重叠看;最后在 QtScrcpy 菜单里的按键映射里重新选择配置文件。
现象:录屏文件只有几秒,或者录出来的 mp4 播放到一半就卡住。 原因:投屏过程中 adb 通道断开,或者手机息屏导致视频流中断,mp4 没有收到完整的结束标记。 解决:录屏期间让手机保持常亮,不要锁屏;把录屏码率调大,帧率固定 30fps;重要的录屏内容用 OBS 采集窗口录制,不要过分依赖 QtScrcpy 自带的录屏。
现象:键盘输入的字符进不了手机,或者手机一直弹出「安全键盘」提示。 原因:QtScrcpy 的键盘事件被手机系统识别为外部输入,部分 App 强制要求使用系统安全键盘,弹窗收走了输入焦点;另一个原因是之前一次投屏非正常退出,控制通道没释放。 解决:退出 QtScrcpy 后打开任务管理器,看有没有 adb.exe 残留进程,有则先结束;然后执行
adb kill-server,重新启动软件。如果是应用内安全键盘干扰,可以尝试在系统设置里关闭安全键盘,或更换第三方输入法。
排查这类问题时,不要只看现象。QtScrcpy 启动时如果有日志窗口,把输出滚动到最上面,第一行报错往往比设置面板里的提示更准,比如ERROR: Could not connect to device指的就是 adb 通道问题,ERROR: Server startup failed指的就是 server 推送问题。日志是区分「软件问题」和「环境问题」最好的依据。
6. 进一步榨干这套工具:命令行参数、按键映射验证与“先验证再投屏”的习惯
前面把 GUI 里的设置说全了,但真正用顺手之后,你会发现每次启动都要手动选设备、选分辨率、选 keymap 很烦。QtScrcpy 继承自 scrcpy,所以常见的 scrcpy 命令行参数也能直接用,把投屏参数固化在脚本里,比每次在界面上点更快。
我常用的启动方式是在命令行里给 QtScrcpy.exe 传一组参数:
QtScrcpy.exe --serial=设备序列号 -m 1280 -b 4M --max-fps 30--serial指定设备,多台手机连电脑时尤其有用;-m 1280限制投屏最长边为 1280 像素,相当于把分辨率压到 720p 级别;-b 4M把码率限制在大约 4Mbps;--max-fps 30锁帧。具体参数名在不同版本里略有差异,运行QtScrcpy.exe --help能看到当前版本支持的完整列表,支持不了的参数它会在启动时忽略。
参数设完,真正要验证的是按键映射有没有落在正确的位置。我常用的土办法是在电脑上执行:
adb.exe shell getevent -lt-l参数让事件输出显示成可读的名称,比如ABS_MT_POSITION_X,-t参数显示事件时间戳。当我在 QtScrcpy 窗口里按下映射键 W 时,这个命令行窗口如果立刻刷出触摸坐标事件,说明按键注入已经生效;如果只有键盘事件没有触摸事件,说明映射配置没加载或者热区坐标根本不在屏幕范围内。
软件越用越熟练以后,我反而不再信任肉眼判断。每次在新手机或新游戏上配按键映射,都强制走一遍固定的流程:先固定投屏分辨率,再截图读取坐标,写入 json,最后用 getevent 验证映射是否触发。这套流程看起来慢,但比凭感觉填坐标然后反复重启投屏快得多,也少了很多「明明点了就是没反应」的玄学问题。希望帮到你。
本文还有配套的精品资源,点击获取