![8a7f5271854b1afb1e684225aa081012.png](https://i-blog.csdnimg.cn/blog_migrate/0f929fcb793a11fe9b8e7834d68eaa74.jpeg)
“机”不离手是大多数人的生活状态,甚至有一个用手机形容真爱的段子:“在一起时不看手机,不在一起时秒回信息,就算现代人的真爱了。
随着手机在日常生活中地位的提升,手机游戏也逐渐成为年轻人日常生活不可或缺的一部分。随时随地,只要网络存在,手游就可以进行,在给用户带来游戏便利的同时,也必然带来细腻操作的缺失,那有没有办法可以鱼与熊掌兼得呢?
今天给大家分享一款安卓游戏利器——Scrcpy,可以方便的将手机游戏完美投屏到PC端,通过按键的组合定制,给用户带来欢畅的游戏体验。
Scrcpy简介
Scrcpy提供了安卓设备的PC端控制和投屏功能,无需用户对安卓手机root,只需要通过USB线或者无线连接即可。目前支持Windows,Linux和Mac,将个人PC端操作系统一网打尽
Scrcpy具有以下优点:
- 轻巧(本机,仅显示设备屏幕,所见即所得)
- 性能好(投屏可达30-60fps)
- 图像质量高(设备分辨率支持1920x1080甚至更高)
- 低延迟(35-70ms的延迟,用户基本无感知)
- 启动时间快(最慢1秒就可展示首张图片)
- 无侵入(设备无需安装任何应用软件)
Scrcpy的使用要求
Scrcpy需要安卓设备操作系统版本5.0以上,并且需要打开安卓设备的adb远程调试。当然由于国内各大手机厂商对原生安卓系统的定制,可能需要一些额外设置来满足使用键盘和鼠标的控制能力。
例如小米设备,需要如下图所示:
![2d94bd8d300c00f5f2aed20a549bde54.png](https://i-blog.csdnimg.cn/blog_migrate/e25f34f50bd3e9ada3319c898faea68c.jpeg)
Scrcpy安装
Scrcpy的安装支持windows、linux和mac,安装链接如下,具体的安装步骤就不一一赘叙了。
Windows
32位:
https://github.com/Genymobile/scrcpy/releases/download/v1.8/scrcpy-win32-v1.8.zip
64位:
https://github.com/Genymobile/scrcpy/releases/download/v1.8/scrcpy-win64-v1.8.zip
Mac使用Homebrew通过brew install scrcpy命令进行安装。
LinuxArch Linux 可以使用AUR安装scrcpy:https://aur.archlinux.org/packages/scrcpy/
Gentoo可以使用Ebuild安装scrcpy:https://github.com/maggu2810/maggu2810-overlay/tree/master/app-mobilephone/scrcpy/
Scrcpy使用
Scrcpy上手简单,只需要将安卓设备通过USB线与电脑相连,然后执行scrcpy命令即可。当然它也支持多种命令行参数,可以通过scrcpy --help进行检索。
我们也可以通过通过无线的方式使用scrcpy,前提是带宽足够,方式如下:
1. 确保手机和电脑在同一个局域网内
2.手机先通过USB和PC相连
3.在手机上运行adb tcpip 5555(任意端口皆可)
4.拔下设备断开USB连接
5.在PC上运行adb connect 手机IP:5555(手机IP可通过手机的状态信息查看)
6.在命令控制台运行scrcpy即可
ps: 通过ctrl+f快捷键,可以切换为全屏模式,这样就可以追求更高的游戏体验了。
Scrcpy工作流程及黑魔法
Scrcpy会在手机设备上部署一个服务器并运行,同时客户端会部署在PC端,两者的交互基于adb通道的socket。工作时,服务器基于设备屏幕生成一段H264格式的视频流,被客户端接收后,进行解码并显示,这样就完成了屏幕的投屏工作。
客户端会捕获PC端的键盘或者鼠标事件,然后发送到服务器端进行处理,完成对游戏的实际操控。更多的工作流程详情,请参考
https://github.com/Genymobile/scrcpy/blob/master/DEVELOP.md
Scrcpy的延迟很小,用户基本无感觉,又是通过什么方式来实现的呢?
1、无缓存视频流编码、传输和解码都需要花费时间,为了降低延迟,必然需要避免任何不必要的延迟,比如通过以下命令生成视频流并播放
adb exec-out screenrecord --output-format=h264 - | vlc - --demux h264
开始的时候一切运行正常,但是很快延迟就会上升,帧率也会损坏,原因是VLC会将PTS与帧率关联,并对视频流进行缓存,进而有时会报错如下:
ES_OUT_SET_(GROUP_)PCR is called too late (pts_delay increased to 300 ms)
后续可以通过ffmpeg人工解码并进行帧率渲染的方式解决。
2、丢弃延迟帧有时候帧率渲染会延迟,这时延迟的已完成解码的帧就可以抛弃,而仅仅渲染最新的完成解码的帧。
Scrcpy是通过什么黑魔法完成手机设备的截屏工作呢?
这是通过部分权限授权给android shell来完成的。从adb shell通过调用app_process的方式,可以在安卓设备上像shell命令一样来运行java代码。如下面的HelloWorld代码:
public class HelloWorld {
public static void main(String... args) {
System.out.println("Hello, world!");
}
}
可以通过
javac -source 1.7 -target 1.7 HelloWorld.java "$ANDROID_HOME"/build-tools/27.0.2/dx --dex --output classes.dex HelloWorld.class
命令完成编译和打包操作,然后通过
adb push classes.dex /data/local/tmp/
命令推送到安卓设备上,接着运行
adb shell CLASSPATH=/data/local/tmp/classes.dex app_process / HelloWorld
结果Hello,world将会输出。
当然仅仅上面是不够的的,还需要借助安卓框架和部分隐藏函数的能力,这就必然需要通过反射来完成对隐藏函数的调用。
以上简单介绍了一下Scrcpy的能力及背后的黑魔法,当然除了可以用它来提升手游的操作体验,还可以结合stf来完成私有云设备的远程操控,更多的应用场景等待大家的一一发现。更多主题,请持续关注~
![6eb6b6cee5cb0a4c2b0e80fbbc25c175.png](https://i-blog.csdnimg.cn/blog_migrate/6cb97f0adf5f4d44e363c5017faa703a.png)