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

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

简介

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倍总是出错

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

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