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
一、如何配置使用呢?
这个工具需要adb、USB或WIFI及「开发者选项」与「USB 调试」(见下图)来进行手机到电脑的投屏配合。至于手机端的「开发者选项」与「USB 调试」如何打开,可搜索相关文档进行折腾。
1. 如果是Windows:
首先直接从这里下载scrcpy-win(如64位,32位)后解压(已经自带了adb),然后在电脑上双击执行scrcpy.exe启动软件。需要注意的是,首次连接时,手机屏幕会弹出如下的对话框。选择同意对设备进行调试。
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 anANDROID_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.jarDeprecated 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_warningsBUILD 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