官网

https://github.com/Genymobile/scrcpy

 

要求

Android 设备至少需要 API 21 (Android 5.0)。

确保在您的设备上启用 adb 调试。

在某些设备上,您还需要启用一个附加选项来使用键盘和鼠标对其进行控制。

下载这个软件

包装状态

概括

  • Linux:apt install scrcpy
  • 视窗:下载
  • 苹果系统:brew install scrcpy

从源代码构建:BUILD简化过程

Linux

在 Debian 和 Ubuntu 上:

apt install scrcpy

在 Arch Linux 上:

pacman -S scrcpy

提供Snap软件包:scrcpy

对于 Fedora,有一个COPR包可用:scrcpy.

对于 Gentoo,可以使用Ebuild:.scrcpy/

您也可以手动构建应用程序简化过程)。

视窗

对于 Windows,可以使用包含所有依赖项(包括 )的预构建存档adb

它也可用于Chocolatey

choco install scrcpy
choco install adb    # if you don't have it yet

独家新闻中:

scoop install scrcpy
scoop install adb    # if you don't have it yet

您也可以手动构建应用程序

苹果系统

该应用程序在Homebrew中可用。只需安装它:

brew install scrcpy

您需要adb,可从您的PATH. 如果您还没有:

brew install android-platform-tools

它也可以在MacPorts中使用,它会adb为您设置:

sudo port install scrcpy

您也可以手动构建应用程序

将 Android 设备插入您的计算机,然后执行:

scrcpy

它接受命令行参数,按以下方式列出:

scrcpy --help

特征

捕获配置

缩小尺寸

有时,以较低的分辨率镜像 Android 设备以提高性能很有用。

将宽度和高度都限制为某个值(例如 1024):

scrcpy --max-size 1024
scrcpy -m 1024  # short version

计算另一个维度是为了保留 Android 设备的纵横比。这样,1920×1080 的设备将被镜像为 1024×576。

更改比特率

默认比特率为 8 Mbps。要更改视频比特率(例如更改为 2 Mbps):

scrcpy --bit-rate 2M
scrcpy -b 2M  # short version

限制帧率

可以限制捕获帧速率:

scrcpy --max-fps 15

自 Android 10 起正式支持此功能,但可能适用于早期版本。

实际的捕获帧率可能会打印到控制台:

scrcpy --print-fps

也可以随时使用MOD+启用或禁用它i

庄稼

可以裁剪设备屏幕以仅镜像屏幕的一部分。

这很有用,例如,仅镜像 Oculus Go 的一只眼睛:

scrcpy --crop 1224:1440:0:0   # 1224x1440 at offset (0,0)

如果--max-size还指定,则在裁剪后应用调整大小。

锁定视频方向

要锁定镜像的方向:

scrcpy --lock-video-orientation     # initial (current) orientation
scrcpy --lock-video-orientation=0   # natural orientation
scrcpy --lock-video-orientation=1   # 90° counterclockwise
scrcpy --lock-video-orientation=2   # 180°
scrcpy --lock-video-orientation=3   # 90° clockwise

这会影响录制方向。

窗口也可以独立旋转。

编码器

有些设备有多个编码器,其中一些可能会导致问题或崩溃。可以选择不同的编码器:

scrcpy --encoder OMX.qcom.video.encoder.avc

要列出可用的编码器,您可以传递一个无效的编码器名称;该错误将提供可用的编码器:

scrcpy --encoder _

捕获

记录

镜像时可以录屏:

scrcpy --record file.mp4
scrcpy -r file.mkv

要在录制时禁用镜像:

scrcpy --no-display --record file.mp4
scrcpy -Nr file.mkv
# interrupt recording with Ctrl+C

“跳过的帧”会被记录下来,即使它们没有实时显示(出于性能原因)。帧在设备上带有时间戳,因此数据包延迟变化不会影响记录的文件。

v4l2环回

在 Linux 上,可以将视频流发送到 v4l2 环回设备,这样任何支持 v4l2 的工具都可以像打开网络摄像头一样打开 Android 设备。

模块v4l2loopback必须安装:

sudo apt install v4l2loopback-dkms

要创建 v4l2 设备:

sudo modprobe v4l2loopback

这将在 中创建一个新的视频设备/dev/videoN,其中N是一个整数(有更多选项可用于创建多个设备或具有特定 ID 的设备)。

列出启用的设备:

# requires v4l-utils package
v4l2-ctl --list-devices

# simple but might be sufficient
ls /dev/video*

要开始scrcpy使用 v4l2 接收器:

scrcpy --v4l2-sink=/dev/videoN
scrcpy --v4l2-sink=/dev/videoN --no-display  # disable mirroring window
scrcpy --v4l2-sink=/dev/videoN -N            # short version

(替换N为设备ID,检查ls /dev/video*

启用后,您可以使用支持 v4l2 的工具打开视频流:

ffplay -i /dev/videoN
vlc v4l2:///dev/videoN   # VLC might add some buffering delay

例如,您可以在OBS中捕获视频。

缓冲

可以添加缓冲。这会增加延迟,但会减少抖动(请参阅 #2464)。

该选项可用于显示缓冲:

scrcpy --display-buffer=50  # add 50 ms buffering for display

和 V4L2 接收器:

scrcpy --v4l2-buffer=500    # add 500 ms buffering for v4l2 sink

联系

TCP/IP(无线)

Scrcpy用于adb与设备通信,并且adb可以通过 TCP/IP连接到设备。设备必须与计算机连接在同一网络上。

自动的

一个选项--tcpip允许自动配置连接。有两种变体。

如果设备(在此示例中可在 192.168.1.1 访问)已经在端口(通常为 5555)上侦听传入adb连接,则运行:

scrcpy –tcpip=192.168.1.1 # default port is 5555

scrcpy –tcpip=192.168.1.1:5555


如果设备上禁用了adb TCP/IP 模式(或者如果您不知道 IP 地址),请通过 USB 连接设备,然后运行:

scrcpy --tcpip    # without arguments

它会自动查找设备 IP 地址,启用 TCP/IP 模式,然后在启动前连接到设备。

手动的

或者,可以使用以下命令手动启用 TCP/IP 连接 adb

  1. 将设备插入计算机上的 USB 端口。

  2. 将设备连接到与您的计算机相同的 Wi-Fi 网络。

  3. 在设置 → 关于手机 → 状态中获取您的设备 IP 地址,或执行以下命令:

    adb shell ip route | awk '{print $9}'
  4. adb在您的设备上通过 TCP/IP启用: adb tcpip 5555.

  5. 拔下您的设备。

  6. 连接到您的设备:(adb connect DEVICE_IP:5555 替换DEVICE_IP 为您找到的设备 IP 地址)

  7. scrcpy像往常一样运行。

从 Android 11 开始,无线调试选项允许绕过将设备直接物理连接到计算机的麻烦。

如果连接随机断开,请运行您的scrcpy命令重新连接。如果它说没有找到设备/模拟器,请尝试adb connect DEVICE_IP:5555再次运行,然后scrcpy像往常一样。如果仍然显示没有找到,请尝试运行adb disconnect,然后再次运行这两个命令。

降低比特率和分辨率可能很有用:

scrcpy --bit-rate 2M --max-size 800
scrcpy -b2M -m800  # short version

多设备

如果列出了多个设备adb devices,您可以指定串行

scrcpy --serial 0123456789abcdef
scrcpy -s 0123456789abcdef  # short version

序列号也可以通过环境变量ANDROID_SERIAL (也由 使用adb)提供。

如果设备通过 TCP/IP 连接:

scrcpy --serial 192.168.0.1:5555
scrcpy -s 192.168.0.1:5555  # short version

如果只有一个设备通过 USB 或 TCP/IP 连接,则可以自动选择它:

# Select the only device connected via USB
scrcpy -d             # like adb -d
scrcpy --select-usb   # long version

# Select the only device connected via TCP/IP
scrcpy -e             # like adb -e
scrcpy --select-tcpip # long version

您可以为多个设备启动多个scrcpy实例。

设备连接时自动启动

您可以使用AutoAdb

autoadb scrcpy -s '{}'

隧道

要连接到远程设备,可以将本地adb客户端连接到远程adb服务器(前提是它们使用相同版本的adb 协议)。

远程 ADB 服务器

要连接到远程adb 服务器,请让服务器监听所有接口:

adb kill-server
adb -a nodaemon server start
# keep this open

警告:客户端和adb 服务器之间的所有通信都是未加密的。

假设此服务器可在 192.168.1.2 访问。然后,从另一个终端运行scrcpy

# in bash
export ADB_SERVER_SOCKET=tcp:192.168.1.2:5037
scrcpy --tunnel-host=192.168.1.2
:: in cmd
set ADB_SERVER_SOCKET=tcp:192.168.1.2:5037
scrcpy --tunnel-host=192.168.1.2
# in PowerShell
$env:ADB_SERVER_SOCKET = 'tcp:192.168.1.2:5037'
scrcpy --tunnel-host=192.168.1.2

默认情况下,scrcpy使用用于adb forward建立隧道的本地端口(通常27183,请参阅--port)。也可以强制使用不同的隧道端口(在更复杂的情况下,当涉及更多重定向时,它可能很有用):

scrcpy --tunnel-port=1234
SSH隧道

为了与远程adb 服务器安全通信,最好使用 SSH 隧道。

首先,确保adb 服务器正在远程计算机上运行:

adb start-server

然后,建立一个 SSH 隧道:

# local  5038 --> remote  5037
# local 27183 <-- remote 27183
ssh -CN -L5038:localhost:5037 -R27183:localhost:27183 your_remote_computer
# keep this open

从另一个终端运行scrcpy

# in bash
export ADB_SERVER_SOCKET=tcp:localhost:5038
scrcpy
:: in cmd
set ADB_SERVER_SOCKET=tcp:localhost:5038
scrcpy
# in PowerShell
$env:ADB_SERVER_SOCKET = 'tcp:localhost:5038'
scrcpy

为避免启用远程端口转发,您可以改为强制转发连接(注意-L而不是-R):

# local  5038 --> remote  5037
# local 27183 --> remote 27183
ssh -CN -L5038:localhost:5037 -L27183:localhost:27183 your_remote_computer
# keep this open

从另一个终端运行scrcpy

# in bash
export ADB_SERVER_SOCKET=tcp:localhost:5038
scrcpy --force-adb-forward
:: in cmd
set ADB_SERVER_SOCKET=tcp:localhost:5038
scrcpy --force-adb-forward
# in PowerShell
$env:ADB_SERVER_SOCKET = 'tcp:localhost:5038'
scrcpy --force-adb-forward

与无线连接一样,降低质量可能很有用:

scrcpy -b2M -m800 --max-fps 15

窗口配置

标题

默认情况下,窗口标题是设备型号。它可以改变:

scrcpy --window-title 'My device'

位置和大小

可以指定初始窗口位置和大小:

scrcpy --window-x 100 --window-y 100 --window-width 800 --window-height 600

无边界

要禁用窗口装饰:

scrcpy --window-borderless

总在最前面

要使scrcpy窗口始终位于顶部:

scrcpy --always-on-top

全屏

该应用程序可以直接全屏启动:

scrcpy --fullscreen
scrcpy -f  # short version

然后可以使用MOD+动态切换全屏f

回转

窗口可以旋转:

scrcpy --rotation 1

可能的值:

  • 0: 没有旋转
  • 1:逆时针90度
  • 2: 180 度
  • 3:顺时针90度

旋转也可以通过MOD (left)MOD (right)动态改变。

请注意,scrcpy管理 3 种不同的旋转:

  • MOD+r请求设备在纵向和横向之间切换(当前运行的应用程序可能会拒绝,如果它不支持请求的方向)。
  • --lock-video-orientation更改镜像方向(从设备发送到计算机的视频的方向)。这会影响录制。
  • --rotation(或MODMOD)仅旋转窗口内容。这仅影响显示,不影响录制。

其他镜像选项

只读

要禁用控件(可以与设备交互的所有内容:输入键、鼠标事件、拖放文件):

scrcpy --no-control
scrcpy -n

展示

如果有多个显示器可用,则可以选择要镜像的显示器:

scrcpy --display 1

可以通过以下方式检索显示 ID 列表:

adb shell dumpsys display   # search "mDisplayId=" in the output

仅当设备至少运行 Android 10 时才能控制辅助显示器(否则它会被镜像为只读)。

保持清醒

为防止设备在插入设备后延迟休眠:

scrcpy --stay-awake
scrcpy -w

scrcpy关闭时恢复初始状态。

关闭屏幕

可以在使用命令行选项启动镜像时关闭设备屏幕:

scrcpy --turn-screen-off
scrcpy -S

或者随时按MOD+ 。o

要重新打开它,请按MODShifto

在 Android 上,该POWER按钮始终打开屏幕。为方便起见,如果 POWER通过scrcpy发送(通过右键单击或MODp),它将在一小段延迟后强制关闭屏幕(尽最大努力)。物理POWER按钮仍会导致屏幕打开。

防止设备休眠也很有用:

scrcpy --turn-screen-off --stay-awake
scrcpy -Sw

关闭电源关闭

在关闭scrcpy时关闭设备屏幕:

scrcpy --power-off-on-close

开机开机

默认情况下,在启动时,设备处于开机状态。

为了防止这种行为:

scrcpy --no-power-on

显示触摸

对于演示,显示物理触摸(在物理设备上)可能很有用。

Android 在Developers options中提供了此功能。

Scrcpy提供了在启动时启用此功能并在退出时恢复初始值的选项:

scrcpy --show-touches
scrcpy -t

请注意,它仅显示物理触摸(通过设备上的手指)。

禁用屏幕保护程序

默认情况下,scrcpy不会阻止屏幕保护程序在计算机上运行。

要禁用它:

scrcpy --disable-screensaver

输入控制

旋转设备屏幕

MOD+r在纵向和横向模式之间切换。

请注意,仅当前台应用程序支持请求的方向时,它才会旋转。

复制粘贴

每当 Android 剪贴板发生变化时,它都会自动同步到计算机剪贴板。

任何Ctrl快捷方式都会转发到设备。尤其是:

  • Ctrl+c通常复制
  • Ctrl+x通常削减
  • Ctrl+v通常粘贴(在计算机到设备的剪贴板同步之后)

这通常按您的预期工作。

但是,实际行为取决于活动的应用程序。例如, Termux 会Ctrl在+上发送 SIGINT c,而K-9 Mail会 编写新消息。

在这种情况下复制、剪切和粘贴(但仅在 Android >= 7 上支持):

  • MOD+c注入COPY
  • MOD+x注入CUT
  • MOD+v注入PASTE(在计算机到设备的剪贴板同步之后)

此外,MOD++将计算机Shift剪贴板v文本作为一系列关键事件注入。当组件不接受文本粘贴(例如在Termux中)时,这很有用,但它可能会破坏非 ASCII 内容。

警告:将计算机剪贴板粘贴到设备(通过 Ctrl+vMODv)会将内容复制到 Android 剪贴板。因此,任何 Android 应用程序都可以读取其内容。您应该避免以这种方式粘贴敏感内容(如密码)。

以编程方式设置设备剪贴板时,某些 Android 设备的行为与预期不同。提供了一个选项--legacy-paste来更改Ctrl+vMOD+的行为,v以便它们也将计算机剪贴板文本作为一系列键事件注入(与MODShift+相同v)。

要禁用自动剪贴板同步,请使用 --no-clipboard-autosync.

捏拉缩放

模拟“捏缩放”:Ctrlclick-and-move

更准确地说,按住Ctrl左键的同时按住。在释放左键单击按钮之前,所有鼠标移动都会相对于屏幕中心缩放和旋转内容(如果应用程序支持)。

从技术上讲,scrcpy在屏幕中心反转的位置从“虚拟手指”生成额外的触摸事件。

物理键盘模拟 (HID)

默认情况下,scrcpy使用 Android 密钥或文本注入:它适用于任何地方,但仅限于 ASCII。

或者,scrcpy可以在 Android 上模拟物理 USB 键盘以提供更好的输入体验(通过 AOAv2 使用 USB HID):虚拟键盘被禁用,它适用于所有字符和 IME。

但是,它仅在设备通过 USB 连接时才有效。

注意:在 Windows 上,它只能在OTG 模式下工作,而不是在镜像时(如果 USB 设备已经被adb 守护程序等其他进程打开,则无法打开它)。

要启用此模式:

scrcpy --hid-keyboard
scrcpy -K  # short version

如果由于某种原因失败(例如因为设备未通过 USB 连接),它会自动回退到默认模式(在控制台中显示日志)。这允许在通过 USB 和 TCP/IP 连接时使用相同的命令行选项。

在这种模式下,原始键事件(扫描码)被发送到设备,独立于主机键映射。因此,如果您的键盘布局不匹配,则必须在 Android 设备上进行配置,在 Settings → System → Languages and input → Physical keyboard

这个设置页面可以直接启动:

adb shell am start -a android.settings.HARD_KEYBOARD_SETTINGS

但是,该选项仅在启用 HID 键盘(或连接物理键盘时)可用。

物理鼠标模拟 (HID)

与物理键盘模拟类似,可以模拟物理鼠标。同样,它仅在设备通过 USB 连接时才有效。

默认情况下,scrcpy使用带有绝对坐标的 Android 鼠标事件注入。通过模拟物理鼠标,在Android设备上出现鼠标指针,并注入鼠标相对运动、点击和滚动。

要启用此模式:

scrcpy --hid-mouse
scrcpy -M  # short version

您还可以添加--forward-all-clicks转发所有鼠标按钮

启用此模式后,计算机鼠标将被“捕获”(鼠标指针从计算机上消失并出现在 Android 设备上)。

特殊的捕获键,或者AltSuper,切换(禁用或启用)鼠标捕获。使用其中之一将鼠标的控制权交还给计算机。

OTG

可以仅使用物理键盘和鼠标模拟 (HID) 运行scrcpy,就好像计算机键盘和鼠标通过 OTG 电缆直接插入设备一样。

在这种模式下,adb(USB 调试)不是必需的,并且镜像被禁用。

要启用 OTG 模式:

scrcpy --otg
# Pass the serial if several USB devices are available
scrcpy --otg -s 0123456789abcdef

可以只启用 HID 键盘或 HID 鼠标:

scrcpy --otg --hid-keyboard              # keyboard only
scrcpy --otg --hid-mouse                 # mouse only
scrcpy --otg --hid-keyboard --hid-mouse  # keyboard and mouse
# for convenience, enable both by default
scrcpy --otg                             # keyboard and mouse

--hid-keyboard和一样--hid-mouse,它仅在设备通过 USB 连接时才有效。

文本注入首选项

输入文本时会生成两种事件:

  • 按键事件,表示按键被按下或释放;
  • text events,表示已输入文本。

默认情况下,字母是使用键事件注入的,因此键盘在游戏中的行为符合预期(通常用于 WASD 键)。

但这可能会导致问题。如果遇到这样的问题,可以通过以下方式避免:

scrcpy --prefer-text

(但这会破坏游戏中的键盘行为)

相反,您可以强制始终注入原始关键事件:

scrcpy --raw-key-events

这些选项对 HID 键盘没有影响(在此模式下,所有按键事件都作为扫描码发送)。

键重复

默认情况下,按住一个键会产生重复的键事件。这可能会在某些游戏中导致性能问题,而这些事件无论如何都是无用的。

为了避免转发重复的关键事件:

scrcpy --no-key-repeat

此选项对 HID 键盘没有影响(按键重复由 Android 在此模式下直接处理)。

右键单击和中键单击

默认情况下,右键单击触发 BACK(或 POWER on),中键单击触发 HOME。要禁用这些快捷方式并将点击转发到设备:

scrcpy --forward-all-clicks

文件丢弃

安装 APK

要安装 APK,请将 APK 文件(以 结尾.apk)拖放到scrcpy 窗口。

没有视觉反馈,日志打印到控制台。

将文件推送到设备

要将文件推送到/sdcard/Download/设备上,请将(非 APK)文件拖放到scrcpy窗口。

没有视觉反馈,日志打印到控制台。

目标目录可以在启动时更改:

scrcpy --push-target=/sdcard/Movies/

音频转发

scrcpy不转发音频。使用sndcpy

另见问题 #14

捷径

在以下列表中,MOD是快捷方式修饰符。默认情况下,它是 (left)Alt或 (left) Super

可以使用--shortcut-mod. 可能的键是lctrlrctrl、 laltralt和。例如:lsuperrsuper

# use RCtrl for shortcuts
scrcpy --shortcut-mod=rctrl

# use either LCtrl+LAlt or LSuper for shortcuts
scrcpy --shortcut-mod=lctrl+lalt,lsuper

Super通常是WindowsorCmd键。

行动 捷径
切换全屏模式 MOD+f
向左旋转显示 MOD (左)
向右旋转显示 MOD (右)
将窗口大小调整为 1:1(像素完美) MOD+g
调整窗口大小以删除黑色边框 MODw双击左键¹
点击HOME MODh中键单击
点击BACK MODb右键单击²
点击APP_SWITCH MODs第四次点击³
点击MENU(解锁屏幕)⁴ MOD+m
点击VOLUME_UP MOD (上)
点击VOLUME_DOWN MOD (下)
点击POWER MOD+p
打开 右键单击²
关闭设备屏幕(保持镜像) MOD+o
打开设备屏幕 MODShift+o
旋转设备屏幕 MOD+r
展开通知面板 MODn第五次点击³
展开设置面板 MODnn双击第五次³
折叠面板 MODShift+n
复制到剪贴板⁵ MOD+c
剪切到剪贴板⁵ MOD+x
同步剪贴板和粘贴⁵ MOD+v
注入计算机剪贴板文本 MODShift+v
启用/禁用 FPS 计数器(在标准输出上) MOD+i
捏拉缩放 Ctrl+点击移动
拖放APK文件 从电脑安装APK
拖放非APK文件 将文件推送到设备

¹双击黑色边框将其删除。
²如果屏幕关闭,右键单击打开屏幕,否则按 BACK。
³第 4 和第 5 个鼠标按钮,如果您的鼠标有它们。
⁴对于开发中的 react-native 应用程序,MENU触发开发菜单。
⁵仅在 Android >= 7 上。

通过释放并再次按下该键来执行具有重复键的快捷方式。例如,要执行“展开设置面板”:

  1. 按住 并按住MOD
  2. 然后双击n
  3. 最后,释放MOD

所有Ctrl+快捷键都转发到设备,因此它们由活动应用程序处理。

自定义路径

要使用特定的adb二进制文件,请在环境变量中配置其路径 ADB

ADB=/path/to/adb scrcpy

要覆盖scrcpy-server文件的路径,请在 SCRCPY_SERVER_PATH.

要覆盖图标,请在 中配置其路径SCRCPY_ICON_PATH