之前发过一篇文章 ATX 系列 - 让 adb install 也能看到进度,看反馈效果还挺好的。所以继续写第二篇。
今天介绍的是 atx 下的另一个命令行工具,专门负责快速的截图。
目前的安卓截图工具虽然很多,比如命令行本身自带的 screencap,或者用第三方工具 豌豆荚,iTools 等等,然而截图的效率以及易用性都还一般,有很多的改进的空间。
随着时间的推移,技术在阳光的照耀下,不断的在进步,一个利用安卓系统的隐藏接口进行快速截图minicap项目就这样悄然诞生了,将截图的速度优化到了 ms 级别。感谢openstf团队做出的杰出贡献。
首先利用 pip 需要安装 atx
pip install --pre --upgrade atx
然后根据 atx 项目的说明安装 python-opencv,这一步的安装比想象中的要简单的多。
之后手机连接上电脑,进行 minicap 的安装。(这个步骤可能在以后还会变化,因为并不优雅)
python -matx minicap
如果没有什么报错的话,就可以用 minicap 截图了。然而并非所有手机都支持 minicap,此时 atx 会回滚到传统的截图方法,保证其可用性。
截图命令
python -matx screencap -o screen.png
打开screen.png
就可以看到截图的文件了
关于 minicap 的原理,我并没有仔细的去研究,据文档上说,是利用了安卓系统的隐藏的 api,所以编译 minicap 时,需要整个安卓系统的源码。
关于 minicap 兼容性的问题,因为国内的手机太多,而项目的作者又不在中国,所以并不可能测试过所有的国内手机。据坊间传闻,阿里内部对 minicap 做了修改,兼容 90% 以上的国内手机,可惜目前不开源。
该工具为了还会做不断的完善和修改。如果使用遇到了问题,可以留言,不过强烈推荐反馈到 github 的 issue 上面,目前的地址是 https://github.com/codeskyblue/AutomatorX/issues
版权所有 ATX 开发组,如需转载请注明 testerhome 文章的地址
你跟 @wuxc 是什么关系啊
#1 楼 @seveniruby 同一个开发组
从那里打开 screen.png
—— 来自 TesterHome 官方 安卓客户端
下面是 cmd 输出
python -matx screencap -m minicap -o 1.jpg
PID: 20962
INFO: Using projection 720x1280@720x1280/0
INFO: (external/MY_minicap/src/minicap_19.cpp:255) Creating SurfaceComposerClient
INFO: (external/MY_minicap/src/minicap_19.cpp:258) Performing SurfaceComposerClient init check
INFO: (external/MY_minicap/src/minicap_19.cpp:265) Creating virtual display
INFO: (external/MY_minicap/src/minicap_19.cpp:271) Creating buffer queue
INFO: (external/MY_minicap/src/minicap_19.cpp:278) Creating CPU consumer
INFO: (external/MY_minicap/src/minicap_19.cpp:284) Creating frame waiter
INFO: (external/MY_minicap/src/minicap_19.cpp:288) Publishing virtual display
INFO: (jni/minicap/JpgEncoder.cpp:64) Allocating 2766852 bytes for JPG encoder
1719 KB/s (45780 bytes in 0.026s)
File saved to "1.jpg"
#5 楼 @hiyolanda 也可能跟手机有关系,有些手机对 minicap 支持的不是很好
#2 楼 @codeskyblue 屏幕录制命令详细的怎么写
—— 来自 TesterHome 官方 安卓客户端
#8 楼 @codeskyblue 我篇文章也看过来,就是在实际的操作过程中我输入的命令可能哪里不对,我输入的 Python -matx screenrecord -o screenrecord.avi 返回
C:\Users\Administrator>python -matx screenrecord -o screenrecord.avi
screen orientation changed to 0
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\atx\adb2.py", line 679, in _listen
listener(line)
File "C:\Python27\lib\site-packages\atx\adb2.py", line 619, in _on_rotation
self.start_minicap(_on_screenchange)
File "C:\Python27\lib\site-packages\atx\adb2.py", line 694, in start_minicap
raise EnvironmentError('minicap not available')
EnvironmentError: minicap not available
是哪里的问题
需要先安装下 minicap python -m atx minicap
安装下
#11 楼 @codeskyblue 安装过了,可以截屏的 截屏命令这样写的 python -matx screencap -o screen.png 录制的命令你能给我写两个例子吗
#13 楼 @codeskyblue C:\Users\Administrator>python -m atx screenrecord -o out.avi
screen orientation changed to 0
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\atx\adb2.py", line 735, in _pull
m assert p.poll() is None
inicap diedA
ssertionError
ERROR: invalid format for -P, need x@x/{0|90|180|270}
Process died.
老报这个错,帮忙看看什么原因
升级下 atx
pip install --upgrade --pre atx
#15 楼 @codeskyblue 升级成功了,接着执行录制命令
C:\Users\Administrator>python -m atx screenrecord -o out.avi
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\atx\adbkit\mixins.py", line 152, in _pull
assert p.poll() is None
AssertionError
Process died.
ERROR: invalid format for -P, need x@x/{0|90|180|270}
minicap died
报这个错
看你这个样子,是什么手机呢?Android 版本多少呢?
#17 楼 @codeskyblue 小米 note
—— 来自 TesterHome 官方 安卓客户端
#17 楼 @codeskyblue 红米 note Android4.4.4
#19 楼 @xuexi123 fixed. 后续关于该问题的讨论,迁移到这里 https://github.com/codeskyblue/AutomatorX/issues/48
#21 楼 @codeskyblue 好的,多谢啦
—— 来自 TesterHome 官方 安卓客户端
现在写了一个 java 方法,调用 linux 下的 python 命令,通过 java -jar 的方式执行得到正确结果,但是通过 jenkins 在该 linux 的 slave 上执行时 Process waitfor 的值为 1,slave 通过 root 账户启动。
/bin/sh -c python -matx screencap -o /tmp/2.jpg
@adfghzhang 输出内容呢?
#24 楼 @codeskyblue 错误流中的信息:
/usr/bin/python: libopencv_gpu.so.2.4: cannot open shared object file: No such file or directory; 'atx' is a package and cannot be directly executed
#25 楼 @adfghzhang 看来 opencv 没有装
#26 楼 @codeskyblue 不是这个啊 我直接执行命令是正常的哦
python -matx screencap -o /tmp/0.jpg
Started screencap
Time spend: 0.84s
File saved to "/tmp/0.jpg"
#27 楼 @adfghzhang 也许就是 java 导致的环境变量缺失的问题
#28 楼 @codeskyblue 应该是了,环境的问题挺让人郁闷的。我查查看
@codeskyblue 升级了 Android6.0,安装 minicap 报错
#30 楼 @adfghzhang 刚修复,更新一下 atx 就好了,原因是因为 stf 主页上的 minicap 被转移到别的目录了
我测试了一下 minicap 的速度好像也不怎么快。。
楼主您好,我用 python 和 java 都尝试调用过这个截图命令,发现程序里面调用的时间都是大于命令行里面返回的时间的,请问这是为什么呢?
在 linux shell 里面使用 time 命令也是如此。
是不是 ATX 在调用 minicap 截图的过程中,从我输入命令到 started screencap 这个过程中消耗了时间?