安卓游戏利器scrcpy

安卓游戏利器scrcpy

“机”不离手是大多数人的生活状态,甚至有一个用手机形容真爱的段子:“在一起时不看手机,不在一起时秒回信息,就算现代人的真爱了。

随着手机在日常生活中地位的提升,手机游戏也逐渐成为年轻人日常生活不可或缺的一部分。随时随地,只要网络存在,手游就可以进行,在给用户带来游戏便利的同时,也必然带来细腻操作的缺失,那有没有办法可以鱼与熊掌兼得呢?

今天给大家分享一款安卓游戏利器——Scrcpy,可以方便的将手机游戏完美投屏到PC端,通过按键的组合定制,给用户带来欢畅的游戏体验。

Scrcpy简介

Scrcpy提供了安卓设备的PC端控制和投屏功能,无需用户对安卓手机root,只需要通过USB线或者无线连接即可。目前支持Windows,Linux和Mac,将个人PC端操作系统一网打尽

Scrcpy具有以下优点:

  1. 轻巧(本机,仅显示设备屏幕,所见即所得)
  2. 性能好(投屏可达30-60fps)
  3. 图像质量高(设备分辨率支持1920x1080甚至更高)
  4. 低延迟(35-70ms的延迟,用户基本无感知)
  5. 启动时间快(最慢1秒就可展示首张图片)
  6. 无侵入(设备无需安装任何应用软件)

Scrcpy的使用要求

Scrcpy需要安卓设备操作系统版本5.0以上,并且需要打开安卓设备的adb远程调试。当然由于国内各大手机厂商对原生安卓系统的定制,可能需要一些额外设置来满足使用键盘和鼠标的控制能力。

例如小米设备,需要如下图所示:

Scrcpy安装

Scrcpy的安装支持windows、linux和mac,安装链接如下,具体的安装步骤就不一一赘叙了。

Windows

32位:

github.com/Genymobile/s

64位:

github.com/Genymobile/s

Mac使用Homebrew通过brew install scrcpy命令进行安装。

LinuxArch Linux 可以使用AUR安装scrcpy:aur.archlinux.org/packa

Gentoo可以使用Ebuild安装scrcpy:github.com/maggu2810/ma

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端的键盘或者鼠标事件,然后发送到服务器端进行处理,完成对游戏的实际操控。更多的工作流程详情,请参考

github.com/Genymobile/s

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来完成私有云设备的远程操控,更多的应用场景等待大家的一一发现。更多主题,请持续关注~

发布于 2019-12-21

文章被以下专栏收录