scrcpy

大约 9 分钟

scrcpy

当我使用scrcpy的时候, 正在运行的应用会知道scrcpy正在运行中么?

Android 系统层面 来说,一般情况下运行中的应用并不会知道 scrcpy 正在捕获屏幕。原因主要有以下几点:

  1. scrcpy 的原理是通过系统提供的屏幕录制/编码接口(MediaCodec 等)来获取画面,与普通的“系统录屏”或“投屏”类似。
  2. Android 并没有为普通应用提供一个 “检测是否正在被录屏/投屏” 的统一回调或 API。也就是说,应用无法直接得知自己此时是否正在被第三方工具捕获画面。
  3. 唯一的例外通常是 DRM(数字版权保护) 或其他安全场景:
    • 比如一些视频播放应用(Netflix、Disney+ 等)在检测到外部投屏或录制时会显示黑屏,或者设置系统属性 FLAG_SECURE 来阻止屏幕截图/录屏。
    • 但这是因为它们启用了 Android 系统自带的防截屏/防录屏机制,与 scrcpy 无关。
  4. 如果应用本身设置了 FLAG_SECURE,scrcpy 也会捕获到黑屏(或者直接被系统禁止),而不会把真正的画面传输出去;但是这并不是因为应用“知道” scrcpy 在运行,而是系统在检测到录屏时遵循了该标志位所要求的保护策略。

因此,普通应用既没有现成手段得知是否在被 scrcpy 投屏,也不会在 scrcpy 运行时收到特定回调或通知。它只会在使用了系统级防录屏手段(如 DRM 或 FLAG_SECURE)时,阻止内容被捕获或呈现黑屏。除此之外,应用对 scrcpy 的存在“无感知”。

可以。scrcpy 的默认工作方式就是 通过 USB 调试 进行画面传输和控制,并 不依赖网络(Wi-Fi/移动数据)来发送视频流。只要手机开启了“USB 调试”并能被 ADB 正常识别,就可以在 无网络 环境下使用 scrcpy 进行投屏和交互。


scrcpy(“screen copy”)是一个由 Genymobileopen in new window 开源的 Android 设备投屏及控制工具。它能够在电脑上以极低的延迟、高清的方式显示并操作手机屏幕,而且无需 root 权限。下面从整体架构和关键技术原理两个层面为你做一个比较深入的介绍。

无网络情况下,可以使用scrcpy传输画面么?

可以。scrcpy 的默认工作方式就是 通过 USB 调试 进行画面传输和控制,并 不依赖网络(Wi-Fi/移动数据)来发送视频流。只要手机开启了“USB 调试”并能被 ADB 正常识别,就可以在 无网络 环境下使用 scrcpy 进行投屏和交互。


为什么不需要网络?

  1. ADB 自身可走 USB 通道

    • scrcpy 的核心通信是通过 ADB 完成的,而 ADB 可以在 USB 模式 下工作,不需要依赖 Wi-Fi 或移动网络。
    • 当我们插上数据线、打开“USB 调试”后,PC 就能和手机建立起 ADB 连接,scrcpy 会借此推送并运行服务端,然后传输视频流。
  2. 数据流通过 USB 传输

    • 手机端采集并编码好的视频数据,通过 ADB 的 端口映射(forward/reverse)在 USB 连接 上直接传回 PC;
    • 反向,PC 发送的鼠标、键盘等输入事件也走同样的 USB 通道返回手机端服务。
    • 整个过程无需任何外部网络资源。

如何在无网络下使用 scrcpy?

  1. 确保已安装 ADB 并能识别到手机

    • 在电脑上安装好 ADB;
    • 使用数据线连接手机,进入“开发者选项”->“启用 USB 调试”;
    • 在终端输入 adb devices,若能看到设备序列号,表示已成功连接。
  2. 下载/安装 scrcpy

    • 根据操作系统(Windows/Linux/macOS)下载安装对应版本的 scrcpy。
    • 命令行下直接运行 scrcpy(或在图形界面双击可执行文件),它会自动通过 ADB 与手机建立连接。
  3. 开始投屏

    • scrcpy 会自动在手机推送 server 并启动;
    • 若一切正常,几秒后就能在电脑上看到手机屏幕画面,并用鼠标、键盘进行操作。

注意:如果你想要 无线投屏(通过 Wi-Fi),则需要手机和电脑在同一局域网或使用 adb 的无线连接方式。但这是可选模式,scrcpy 默认就能在纯 USB 环境下工作,不需要网络。


总结

  • scrcpy 默认通过 USB 调试,只要 ADB 能识别手机,就能进行画面投屏和远程操作。
  • 不需要网络/Wi-Fi,也无需手机 Root。
  • 对于大多数场景(如在离线环境下进行演示、测试、调试等),插上数据线就能正常使用。

一、整体架构

scrcpy 采用 “PC 端客户端” + “手机端服务端” 的双端模式,二者通过 ADB 建立连接,并进行视频流和输入事件的双向通信。

  1. PC 端客户端(Client)

    • 在电脑上运行的可执行文件,一般使用 scrcpy 命令启动。
    • 负责通过 ADB 与手机通信,并接受手机发来的视频数据流;
    • 负责将视频解码后在窗口中显示;
    • 同时捕获鼠标、键盘事件,将其转换成 Android 可识别的输入指令,再经由 ADB 发送给手机端。
  2. 手机端服务端(Server)

    • scrcpy 在启动时,会通过 adb push 将一个小型的 “server” 程序(编译好的 jar 或可执行文件)推送到手机 /data/local/tmp/ 目录;
    • PC 端通过 adb shell 命令在手机上执行这个 server;
    • 该 server 利用手机的 媒体编码器 (MediaCodec) 或相关硬件加速接口,将屏幕捕获并实时编码成视频流(通常是 H.264 或 H.265);
    • 然后通过 socket(经 ADB 端口转发/反向端口映射)把编码后的视频流发送回 PC 客户端;
    • 同时也接收来自 PC 的输入事件指令,并调用 Android 的输入注入接口在手机上执行点击、按键等操作。

注意:之所以不需要 root,是因为 scrcpy 只使用了官方公开的 ADB 调试通道和系统提供的 MediaCodec 编码能力,不涉及需要 root 的任何底层改动。


二、关键技术点

  1. ADB 通信

    • scrcpy 通过 ADB 与手机建立连接,并使用 ADB 的 端口转发 (forward)反向端口映射 (reverse) 技术,让手机端的 server 能够把视频数据流发送到 PC。
    • 整个通信基于 TCP SocketLocal Socket,但对最终用户是透明的,用户只需安装 adb 并开启 USB 调试即可。
  2. 屏幕捕获

    • 在 Android 5.0 之后,可以使用 VirtualDisplay + MediaCodec 的方式实现无 root 的屏幕捕获(类似于系统录屏的技术原理)。
    • 或者部分手机也支持 Android.Media.projection.MediaProjection API(不过 scrcpy 早期版本更多是通过一些底层接口直接拿到 framebuffer/Surface 的内容,再走编码流程)。
    • server 会将帧缓冲交给 MediaCodec 做硬件编码,极大提升效率,并减少 CPU 消耗。
  3. 视频硬件编码 (MediaCodec)

    • server 在手机端使用 MediaCodec(硬件或软件编码器)将捕获到的屏幕图像实时编码成 H.264/H.265 视频。
    • scrcpy 会尽量使用硬件编码以减少对手机性能的影响,也让画面传输更流畅。
  4. 视频传输与解码

    • server 把编码后的 H.264/H.265 通过 socket 传给 PC 客户端;
    • PC 客户端使用 FFmpeg 库或者平台原生的解码 API 来解码该视频流;
    • 解码后再通过 SDL2 等图形库实时显示在电脑窗口上,实现投屏效果。
  5. 输入事件注入

    • 当用户在 PC 上用鼠标点击、拖拽或键盘输入时,scrcpy 客户端会将这些事件转换成相应的 Android input 指令(比如模拟点击屏幕、发送按键等);
    • 通过 ADB/socket 传回手机端的 server;
    • server 端再调用 Android 系统提供的 输入注入 接口(类似 InputManagerinput 命令行)来在手机上执行对应操作,从而达到 “用电脑控制手机” 的效果。
  6. 帧率和分辨率调节

    • scrcpy 可以指定 比特率最大分辨率最大 FPS 等参数,以在画质和性能之间平衡。
    • 若手机性能或网络带宽不足,可下调分辨率和码率,减少视频传输负荷。
  7. 无设备端应用界面

    • scrcpy 在手机上运行的 server 是纯命令行工具,默认没有可见界面或图标。
    • 这样可以最小化对手机系统的侵扰,也无需用户去安装单独的 APK。

三、优点与特点

  1. 无需 Root
    只要开启 USB 调试,即可使用 scrcpy 投屏并控制手机。

  2. 实时性、低延迟
    得益于硬件编码和高效的数据传输,scrcpy 在同类投屏工具中延迟非常低,基本能满足实时操作游戏或应用的需求。

  3. 画质可调
    可以通过命令行参数设置分辨率、码率、帧率等,兼顾画质与性能。

  4. 跨平台

    • scrcpy 在 WindowsmacOSLinux 都可使用;
    • 只要安装了正确版本的 adb 及相关依赖即可。
  5. 开源社区活跃
    由 Genymobile 维护并在 GitHub 开源,社区贡献了很多功能和修复。


四、工作流程小结

  1. PC 侧启动 scrcpy

    • 检测并连接手机(通过 USB 或 Wi-Fi ADB)。
    • scrcpy 会将编译后的 server 推送到手机并执行。
  2. Server 在手机端启动

    • 创建虚拟显示或获取 Surface,以捕获屏幕图像。
    • 调用 MediaCodec 硬件编码成 H.264/H.265 视频流。
    • 通过 socket 经 ADB 端口映射发送给 PC。
  3. PC 侧接收并解码显示

    • 读取来自手机的压缩视频流。
    • 使用 FFmpeg / SDL2 等解码并呈现在窗口上。
    • 同时将用户鼠标、键盘事件发回手机端 server。
  4. 手机端 server 注入输入

    • 将接收的事件转换为 Android 原生输入事件,执行点击、滑动、按键等操作。

五、与其他投屏工具对比

  • VysorTeamViewerAirDroid 等同类工具可能需要额外安装 APK、注册账户、或者付费才能启用高级功能。
  • scrcpy 完全免费、开源、轻量,并且没有强制界面广告。
  • 在性能和延迟方面,scrcpy 一般也表现得更为出色和灵活。

总体而言

scrcpy 的核心就是:

  1. 用一个轻量级 server 在手机端捕获并硬件编码屏幕;
  2. 用 ADB + Socket 传输视频流到 PC;
  3. PC 端再解码并显示,同时将用户的输入事件回传给手机。

它充分利用了 Android 官方提供的调试机制 (ADB)硬件编解码 能力,因此在画质、延迟、功能兼容性上都表现很好,也被广泛用于日常投屏、手机 APP 测试、游戏直播、录屏等场景。

上次编辑于:
贡献者: biezhihua