ATX [atx 系列] Android 屏幕同步和录制工具

wuxc · 2016年05月27日 · 最后由 11111111 回复于 2018年01月09日 · 5045 次阅读
本帖已被设为精华帖!

简介

atx 是基于图像识别的自动化测试工具,里面也附带了一些其他的小工具,比如本文要介绍的 Android 屏幕同步显示和录制工具。
屏幕同步显示主要是将手机屏幕同步显示到电脑上,方便项目展示交流。atx 的屏幕同步显示工具支持简单模式和交互模式,交互模式下还可以在电脑端来进行点击、滑动和一些按键操作。在屏幕旋转的时候同步窗口也会自动旋转。
屏幕录制是将屏幕变化记录到视频文件中,可以输出为 avi 或 mp4 格式的文件,输出视频的宽高尺寸是根据手机的宽高、缩放系数、按横屏或竖屏来确定,开始录制后,如果屏幕发生旋转,会自动缩放图片来适应视频尺寸,空白会以黑边填充。视频分辨率也是利用缩放系数来控制,更容易做到高清无码。

原理

截屏使用了 openstf 的 minicap 工具,minicap 可以截取屏幕输出到标准输出,或者输出到 socket。选择输出到 socket 然后转发到 pc 上,在 pc 端监听并解析消息,就可以得到相对比较实时的屏幕图像了,经测试,此方法同步图像的速度大致为 30 毫秒。图片展示用的 opencv 模块。

minicap 启动的时候需要根据屏幕旋转方向来确定启动参数,如果已经启动之后,再旋转屏幕,会出现只显示一半图像的情况。为解决这个问题,使用了 openstf 的 rotationwatcher 来监听屏幕旋转,当发生屏幕旋转时重启 minicap 进程,重启耗时约 1 秒。

屏幕交互采用了 minitouch 来模拟点击和滑动操作,用 adb shell sendevent 来模拟按键和键盘操作。minitouch 也是通过 socket 和手机端连接,不断发操作指令过去。sendevent 则是每次都需要通过 adb 子进程来发送指令,速度比较慢,此外用键盘输入也不能附带键盘状态(例如 Shift),所以这边还有较大的限制,后续计划参考 openstf 的 STFService 来做改善。

录屏跟截屏一样使用的 minicap,唯一增加的就是用 opencv 的 VideoWrite 不断将图像写入视频文件。写入时将 fps 限定在了 24 帧,虽然截屏是在后台进程,不需要考虑 minicap 的 30 毫秒限制 (不过高于这个频率之后也没太大意义),但写入文件占用了一定时间,帧率太高会导致卡死。

使用

安装

安装了 atx 库之后,连接手机,先安装 minicap

python -matx minicap

如果需要开启屏幕显示的交互,则还需要安装 minitouch(最新版 atx 在安装 minicap 时会同步安装 minitouch)

屏幕显示

python -matx screen

屏幕显示的可选参数和选项有:

  • 缩放尺寸 (--scale 或 -s),可以根据手机屏幕分辨率来调整,默认按照 1080x1920 的屏幕设置的 0.5 倍
  • 关闭交互 (--simple), 交互需要 minitouch 支持

屏幕录制

python -matx screenrecord

屏幕录制的可选参数和选项有:

  • 缩放尺寸 (--scale 或 -s), 同屏幕显示
  • 输出路径 (--out 或 -o), 默认值为 out.avi
  • 设置文件覆盖 (--overwrite), 开启后如果输出路径已存在会强制覆盖
  • 设置为竖屏方向 (--portrait), 开启后会按照竖屏的尺寸输出为视频,适用于竖屏应用
  • 设置关闭同步显示 (--quiet 或 -q), 开启后不会同步显示当前手机画面的窗口

参考

共收到 15 条回复 时间 点赞

看看,学习了

这个思路不错. 加精了. 是不是不支持模拟器?

#2 楼 @seveniruby 模拟器自带录屏功能的

这个不错,mark 下

求一个能在 windows 上 ios 最简便的录屏方案。除了 airplay

—— 来自 TesterHome 官方 安卓客户端

#5 楼 @chengaomin 不知道 你录屏幕的概念,但是 quicktime 能基本满足 录屏幕

这个不错啊

8楼 已删除

#3 楼 @codeskyblue屏幕录制的命令怎么写,python -matx screenrecord 后面写什么

—— 来自 TesterHome 官方 安卓客户端

截屏的我写的 python -matx screen -o screen,png

#10 楼 @xuexi123 求回复

—— 来自 TesterHome 官方 安卓客户端

codeskyblue [该话题已被删除] 中提及了此贴 07月18日 19:05

不错,学习了

刚试了一下。。发现如果当前界面是动图的话(游戏界面)。。延迟十分厉害...还有一个如何添加 udid 启动呢。。连上两个设备,默认选择 udid list 第一个。。。

请教一个问题,如果我用 python 调用 shell 的方式调用这个命令,如何正确的关闭这个进程呢?直接 kill 这个进程导致最终保存的视频格式不正确,谢谢

python2 -matx screenrecord -q --overwrite -o demo.mp4 --scale 1.0 --portrait
output file exists!
overwriting demo.mp4
minicap is running, killing 22643
starting minicap 1080x1920@1080x1920/0
minicap connected (1, 24, 29225, 1080, 1920, 1080, 1920, 0, 2)
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/atx/cmds/screenrecord.py", line 61, in main
    time.sleep(1.0/fps - max(toc-tic, 0))
IOError: [Errno 22] Invalid argument
2017-07-13 19:18:28.178 Python[20836:2936860] WARNING: -finishWriting should not be called on the main thread.

请问我这么配置不行吗?1 倍总是出错

xiaqing 机器学习技术在 App 启动测试中的一次尝试 中提及了此贴 10月26日 17:37

问个问题,minitouch 实现的滑动准确度怎样?我尝试时,发现还是会略微差一些像素。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册