跳转到主要内容
x

Scrcpy: Linux下的Android手机投屏

手机投屏折腾过好几个方案,但大体都是基于DLNA、Miracast等USB或无线方式。其他相关的软件,如ApowerMirror、幕享、Vysor无不如此,还曾经付费使用过过有一个香港开发团队的开发方案AirDroid。不过,此处将讨论采用另外一种方式:scrcpy

Scrcpy: 这是一个基于USB或TCP/IP,且无需Root权限、无需手机端安装任何软件的投屏工具,具有低延迟(35〜70ms)、高画质(1920×1080或以上)、高性能(30〜60fps)等特点。其项目地址在https://github.com/Genymobile/scrcpy

一、如何配置使用呢?

这个工具需要adbUSBWIFI及「开发者选项」与「USB 调试」(见下图)来进行手机到电脑的投屏配合。至于手机端的「开发者选项」与「USB 调试」如何打开,可搜索相关文档进行折腾。

1. 如果是Windows

首先直接从这里下载scrcpy-win(如64位32位)后解压(已经自带了adb),然后在电脑上双击执行scrcpy.exe启动软件。需要注意的是,首次连接时,手机屏幕会弹出如下的对话框。选择同意对设备进行调试。

adb-usb

2. 如果是Mac

采用HomeBrew 对scrcpy进行安装,具体可参见该文

3. 如果Debian/Ubuntu Linux:

1)首先,克隆scrcpy

git clone https://github.com/Genymobile/scrcpy

2) 其次,安装scrcpy运行环境

sudo apt install ffmpeg libsdl2-2.0-0

3)随后,安装scrcpy客户端编译依赖包(如果直接用编译好的scrcpy包,可以不用安装编译环境,点击下载Scrcpy Linux

sudo apt install make gcc git pkg-config meson ninja-build libavcodec-dev libavformat-dev libavutil-dev libsdl2-dev libavdevice-dev

注意:上述命令有安装meson。在低版本的Debian/ubuntu系统中,上述的meson安装命令可能会失败,此时可采用如下命令来进行:

sudo apt install python3-pip

pip3 install meson

注意:pip3的下载安装方式太慢,可更换pip地址:

nano ~/.pip/pip.conf

添加如下代码:

[global]
index-url=https://pypi.tuna.tsinghua.edu.cn/simple/

[install]
trusted-host=pypi.tuna.tsinghua.edu.cn

4)以及,安装scrcpy服务器编译依赖包(可直接下载编译好的scrcpy-server包

sudo apt install openjdk-8-jdk

注意:如直接使用已编译好的(点此下载),可不执行上面的openjdk-8-jdk安装命令!!openjdk-8-jdk主要用于编译生成scrcpy-server。具体的编译教程见https://github.com/Genymobile/scrcpy/blob/master/BUILD.md。

注意:编译好或下载好的scrcpy-server-v1.9.jar需改名为scrcpy-server.jar,然后拷贝到/home/~/scrcpy/x/server下。否则会出现error: "adb push" returned with value 1这样的错误字样。

5)以及,下载或安装Android SDK包

Android SDK尽管可以采用如下的命令安装:

sudo apt-get install android-sdk android-sdk-platform-tools

但这个命令所安装得到的版本似乎低了些,后面的scrcpy编译过程可能会出现多种错误,包括:

Failed to install the following Android SDK packages as some licences have not been accepted.
     platforms;android-26 Android SDK Platform 26
     build-tools;28.0.3 Android SDK Build-Tools 28.0.3
  To build this project, accept the SDK license agreements and install the missing components using the Android Studio SDK Manager.

以及如下错误:

Error: SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.

因此,强烈建议先直接安装Android-studio,利用它来获得最新版本的Android-SDK完整包:

sudo apt-get install android-studio

这个android-studio会自动下载完整的SDK(可将默认下载SDK文件夹命名为Android-SDK)到/home/~下。获得完整的Android-SDK后,进行如下配置:

A. 添加SDK环境变量

nano ~/.profile

在行末添加如下代码,然后保存(按ctrl+x退出,然后再按Y保存):

export ANDROID_HOME=/home/~/Android-SDK
export PATH=$ANDROID_HOME/tools:$PATH
export PATH=$ANDROID_HOME/platform-tools:$PATH

再执行命令:

source ~/.profile

B. 执行同意license操作

cd /home/~/Android-SDK/Sdk/tools/bin
yes | sdkmanager --licenses

6)正式编译scrcpy

A.  解压缩先前克隆的scrcpy压缩包,配置scrcpy中的local.properties文件,添加如下代码行:

sdk.dir = /home/~/Android-SDK

*配置目的:让scrcpy编译时能找到Android-SDK所在位置。当然其实前面的.profile已经有体现了。

B. 配置scrcpy中的build.gradle文件,将其中的所有代码替换为:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {

    repositories {
        maven { url 'https://plugins.gradle.org/m2/' }
        maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } 
        maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'} 
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        maven { url 'https://plugins.gradle.org/m2/' } 
        maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' } 
        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }  
        maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'} 
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

*配置目的:scrcpy编译时会下载gradle包,默认的配置下载地址实在太慢了。

C. 正式开始编译操作

cd scrcpy

meson x --buildtype release --strip -Db_lto=true

cd x

ninja

如果看到如下的反馈信息,说明编译成功:

ninja
[0/1] Generating scrcpy-server with a custom command.

> Configure project :server
File /home/liumwei/.android/repositories.cfg could not be loaded.
Checking the license for package Android SDK Build-Tools 28.0.3 in /home/liumwei/Android/Sdk/licenses
License for package Android SDK Build-Tools 28.0.3 accepted.
Preparing "Install Android SDK Build-Tools 28.0.3 (revision: 28.0.3)".
"Install Android SDK Build-Tools 28.0.3 (revision: 28.0.3)" ready.
Installing Android SDK Build-Tools 28.0.3 in /home/liumwei/Android/Sdk/build-tools/28.0.3
"Install Android SDK Build-Tools 28.0.3 (revision: 28.0.3)" complete.
"Install Android SDK Build-Tools 28.0.3 (revision: 28.0.3)" finished.

> Task :server:lintVitalRelease
Calling mockable JAR artifact transform to create file: /home/liumwei/.gradle/caches/transforms-2/files-2.1/61f51024f1953a6f07ac327e104a10a6/android.jar with input /home/liumwei/Android/Sdk/platforms/android-29/android.jar

Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.5.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 1m 28s
26 actionable tasks: 26 executed

二、如何使用

首先连接手机,然后打开USB调试,之后进入scrcpy目录下,可以看到当前目录下有可执行文件run。此时,执行命令:

./run x

此时,只要手机通过USB连接到电脑上,并打开USB调试模式,即可看到手机成功投屏到电脑桌面上。而且,在电脑上可以手机进行任何操作。

 

三、ADB方式投屏后记

相关成品文件下载:

  • 已编译的scrcpy文件(linux版本): scrcpy_1.12.deb,下载这个包后,可以使用gdebi进行安装(软件包安装器)。这个版本的scrcpy会默认安装adb, libavcodec57|libavcodec58, libavutil55|libavutil56, libavformat57, libsdl2-2.0-0, ffmpeg等。如果安装后不能使用,注意看看是不是这些包版本不符合要求。
  • 当然,如果对于Debian sid版本,可以直接使用命令安装:

sudo apt install adb scrcpy

四、WIFI投屏[1]

由于scrcpy基于ADB发挥功能,而ADB本身是支持USB和WIFI进行信息通讯的,因此,我们还可以基于WIFI(手机、电脑需处于同一局域网或网段内 )进行设备的投屏。具体如下操作:

1.获知手机IP地址:设置 →关于手机→状态

2.启用 adb TCP/IP 连接(端口号5555),执行命令:

adb tcpip 5555

3. 此时可以拔掉USB了,通过 WiFi 进行连接,

adb connect 手机IP地址:5555

4. 打开scrcpy 即可

技巧:若这种方式下,速度较慢,可以调整投屏的分辨率

scrcpy -b 3M -m 1024

上述命令意味着:限制为3 Mbps,画面分辨率为1024进行传输,这个数值是可以根据自己的需求进行调整的。如果要切换会USB模式,可以使用命令:

adb usb

查看链接的手机

adb devices

List of devices attached
192.168.88.230:5555    device

USB模式下,用命令下链接手机

scrcpy -s 手机ID

五、相关功能与操作

1. 拖拽操作

投屏下,功能支持屏幕鼠标控制、键盘输入、电脑剪切板复制粘贴、拖放文件传输到手机(默认传输到手机的/sdcard/目录下)和 APK拖放安装。

2. 录屏[1]

投屏的同时录屏

scrcpy -r video.mp4

不投屏仅录屏

scrcpy -Nr video.mp4

3. Scrcpy相关命令[1]

关闭手机屏幕    scrcpy -S
限制画面分辨率    scrcpy -m 1024 (比如限制为 1024)
修改视频码率    scrcpy -b 4M (默认 8Mbps,改成 4Mbps)
裁剪画面    scrcpy -c 1224:1440:0:0 #表示分辨率 1224x1440 并且偏移坐标为 (0,0)
多设备切换    scrcpy -s 设备ID (使用 adb devices 命令先搜索手机ID)
窗口置顶    scrcpy -T
显示触摸点击    scrcpy -t #这个在演示或录制教程时,特别有用,可显示操作中的点击动作
全屏显示    scrcpy -f
文件传输默认路径    scrcpy --push-target /sdcard/download #指定将文件拖放时,在手机中保存的目录路径
只读模式(仅显示不控制)    scrcpy -n
屏幕录像    scrcpy -r video.mp4 或 video.mkv
屏幕录像 (禁用电脑显示)    scrcpy -Nr video.mkv
设置窗口标题    scrcpy --window-title 'cell!'
同步传输声音    可借助 USBaudio 这个开源项目实现(仅支持 Linux)

4.Scrcpy快捷键[1]

切换全屏模式    Ctrl+F
将窗口调整为1:1(完美像素)    Ctrl+G
调整窗口大小以删除黑色边框    Ctrl+X | 双击黑色背景
设备 HOME 键    Ctrl+H | 鼠标中键
设备 BACK 键    Ctrl+B | 鼠标右键
设备 任务管理 键 (切换APP)    Ctrl+S
设备 菜单 键    Ctrl+M
设备音量+键    Ctrl+↑
设备音量-键    Ctrl+↓
设备电源键    Ctrl+P
点亮手机屏幕    鼠标右键
复制内容到设备    Ctrl+V
启用/禁用 FPS 计数器(stdout)    Ctrl+i

六、USB Audio Interface声音传输

基于PulseAudio服务,可利用USBaudio进行声音同步传输。USBaudio编译很简单,可如下操作:

首先安装编辑依赖包:

sudo apt install gcc git meson vlc libpulse-dev libusb-1.0-0-dev

然后克隆代码:

git clone https://github.com/rom1v/usbaudio

进行编译:

cd usbaudio
meson x --buildtype=release
cd x
ninja

此时,在usbaudio/x下会生成usbaudio二进制文件。将其设置为可执行,然后拷贝到/usr/bin下即可完成安装:

sudo chmod +x usbaudio
sudo cp usbaudio /usr/bin

链接手机到USB接口,在前述scrcpy正常尽心投屏后,在终端下执行:

usbaudio

正常情况下,声音会自动通过USB从手机传递到电脑上。不过,在Anriod8+后,由于AOAv2 音频被弃用,可能会出现下面的错误“

[INFO] Device: [12d1:107e] 5EF7N18122001848
[INFO] Audio forwarding enabled
[INFO] Waiting for input source...
[ERROR] Could not find matching PulseAudio input source

此时,可如下进行故障排除:

使用命令查看电脑的USB接口上的设备:lsusb

Bus 004 Device 003: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 004 Device 002: ID 8087:8000 Intel Corp.
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:8008 Intel Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 003: ID 0bda:0411 Realtek Semiconductor Corp.
Bus 003 Device 002: ID 0bda:0411 Realtek Semiconductor Corp.
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 006: ID 0557:2419 ATEN International Co., Ltd
Bus 002 Device 003: ID 0557:7000 ATEN International Co., Ltd Hub
Bus 002 Device 009: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 002 Device 008: ID 0bda:5411 Realtek Semiconductor Corp.
Bus 002 Device 007: ID 046d:c52e Logitech, Inc. MK260 Wireless Combo Receiver
Bus 002 Device 005: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 002 Device 004: ID 0d8c:0014 C-Media Electronics, Inc. Audio Adapter (Unitek Y-247A)
Bus 002 Device 002: ID 0bda:5411 Realtek Semiconductor Corp.
Bus 002 Device 035: ID 12d1:107e Huawei Technologies Co., Ltd.
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

注意,在我们的测试中,上面列出的huawei就是连接到USB接口手机设备,其设备ID为12d1:107e。

此时,可以再试试如下命令,看能否将声音传输到电脑中:

usbaudio -d 12d1:107e

或者,采用命令:

usbaudio -s 5EF7N18122001848

如果成功,可以看见计算机系统中的声音设置工具,应该能找到相应的声卡设备。我们可以在OBS中选择可抓取的声音设备了。如果声音成功传输,但声音结巴,可以采用如下命令:

usbaudio --live-caching=100

当然,如果仍然出现错误“Could not find matching PulseAudio”,可以先启用音频附件而不播放,等待后续操作:

usbaudio -n

使用如下命令,罗列alsa声卡服务(Pulseaudio是基于alsa服务之上的声卡服务)能看到的声音设备:

aplay -l | grep card

可看到类似的信息(注意,类似的命令还有aplay -L,pactl list short sources,或采用cat /proc/asound/cards来查看):

card 0: HDMI [HDA ATI HDMI], device 3: HDMI 0 [HDMI 0]
card 0: HDMI [HDA ATI HDMI], device 7: HDMI 1 [HDMI 1]
card 0: HDMI [HDA ATI HDMI], device 8: HDMI 2 [HDMI 2]
card 0: HDMI [HDA ATI HDMI], device 9: HDMI 3 [HDMI 3]
card 0: HDMI [HDA ATI HDMI], device 10: HDMI 4 [HDMI 4]
card 1: Device [USB Audio Device], device 0: USB Audio [USB Audio]

可见Pulseaudio可获取到USB声音设备。但未出现在Pulseaudio中。随即,编辑配置文件/etc/pulse/default.pa,添加这样的代码行:

load-module module-alsa-sink device=hw:0

注意:这里,把0替换为没有出现的USB声音设备的编号。保存该文件,并注销重新登陆系统,应该会看到设备列表中出现USB声音设备。

 

 

 

参考

1. Scrcpy - 开源免费在电脑显示手机画面并控制手机的工具 (投屏/录屏/免Root):https://www.iplaysoft.com/scrcpy.html
2. Ubuntu安卓手机投屏:https://blog.csdn.net/zekdot/article/details/94782904
https://zhuanlan.zhihu.com/p/44466621
https://developer.android.com/studio/intro/update.html#download-with-gradle
https://stackoverflow.com/questions/54273412/failed-to-install-the-following-android-sdk-packages-as-some-licences-have-not-b
https://stackoverflow.com/questions/27620262/sdk-location-not-found-define-location-with-sdk-dir-in-the-local-properties-fil
https://stackoverflow.com/questions/39760172/you-have-not-accepted-the-license-agreements-of-the-following-sdk-components

五款良心投屏软件,将安卓&iOS投射到大屏幕:https://sspai.com/post/43568
安装Android Sdk环境变量:https://www.jianshu.com/p/86b9c57bf838

USB声音设备:https://askubuntu.com/questions/687062/usb-audio-interface-not-showing-device-in-list-for-pulseaudio
Introducing USBaudio:https://blog.rom1v.com/2019/06/introducing-usbaudio