Python:minicap实现快速截图
一:minicap简介
minicap属于STF框架的⼀个⼯具,可以⾼速截图、同步⼿机屏幕⾄浏览器等功能,经过试验,截同⼀个屏幕的⼀张图,使⽤adb shell screencap命令进⾏截图速度为2.9秒,⽽minicap仅为0.8秒,效率⾼很多。
import os
import socket
import sys
import time
import struct
from collections import OrderedDictclass Banner:def __init__(self):self.__banner = OrderedDict([('version', 0),('length', 0),('pid', 0),('realWidth', 0),('realHeight', 0),('virtualWidth', 0),('virtualHeight', 0),('orientation', 0),('quirks', 0)])def __setitem__(self, key, value):self.__banner[key] = valuedef __getitem__(self, key):return self.__banner[key]def keys(self):return self.__banner.keys()def __str__(self):return str(self.__banner)class Minicap:def __init__(self, host, port, banner):self.buffer_size = 4096self.host = hostself.port = portself.banner = bannerdef connect(self):try:self.__socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)except (socket.error) as e:# print(e)sys.exit(1)self.__socket.connect((self.host, self.port))def on_image_transfered(self, data):# file_name = str(time.time()) + '.jpg' # 图片名file_name = '1' + '.jpg' # 图片名with open(file_name, 'wb') as f:for b in data:f.write((b).to_bytes(1,'big'))def consume(self):readBannerBytes = 0bannerLength = 24readFrameBytes = 0frameBodyLength = 0data = []while True:try:chunk = self.__socket.recv(self.buffer_size)except (socket.error) as e:# print(e)sys.exit(1)cursor = 0buf_len = len(chunk)while cursor < buf_len:if readBannerBytes < bannerLength:map(lambda i, val: self.banner.__setitem__(self.banner.keys()[i], val),[i for i in range(len(self.banner.keys()))], struct.unpack("<2b5ibB", chunk))cursor = buf_lenreadBannerBytes = bannerLength# print(self.banner)elif readFrameBytes < 4:# print(struct.unpack('B', (chunk[cursor]).to_bytes(1,'big')))# frameBodyLength += (struct.unpack('B', chunk[cursor])[0] << (readFrameBytes * 8)) >> 0frameBodyLength += (chunk[cursor] << (readFrameBytes * 8)) >> 0cursor += 1readFrameBytes += 1else:# print("frame length:{0} buf_len:{1} cursor:{2}".format(frameBodyLength, buf_len, cursor))# pic endif buf_len - cursor >= frameBodyLength:data.extend(chunk[cursor:cursor + frameBodyLength])self.on_image_transfered(data)cursor += frameBodyLengthframeBodyLength = readFrameBytes = 0data = []else:data.extend(chunk[cursor:buf_len])frameBodyLength -= buf_len - cursorreadFrameBytes += buf_len - cursorcursor = buf_lenif '__main__' == __name__:# 手动打开调试模式# 推送minicappath = os.popen('adb shell ls /data/local/tmp/minicap').read().strip()print(path)if 'No such file or directory' in path:os.popen('uiautomator2 init') # 初始化uiautomator2,用于安装 minicap 和 atx-agenttime.sleep(2)os.popen('adb forward tcp:1717 localabstract:minicap') # 执行了adb端口转发os.popen('adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P 1920x720@1920x720/0') # 启动了minicap服务time.sleep(1)mc = Minicap('localhost', 1717, Banner())mc.connect()mc.consume()
一.第一次运行时,需要初始化uiautomator2用于推送minicap 和 atx-agent到设备。
二.运行时,会在同目录下生成图片
三.
file_name = str(time.time()) + '.jpg' # 图片名,会生成每次界面刷新的图片
file_name = '1' + '.jpg' # 图片名,只保留最后一次刷新的图片
四.
os.popen('adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P 1920x720@1920x720/0') # 启动了minicap服务
1920x720是我连接设备屏幕尺寸,这里根据自己连接设备尺寸来修改
Python:minicap实现快速截图相关推荐
- 利用 Python + Selenium 自动化快速截图
Selenium 是一个可以让浏览器自动化地执行任务的工具,常用于自动化测试.与bs4等结合使用,也适合爬取动态网页数据.不过没想到,它居然可以用于网页截图,而且由于可编程性,用法更具想象空间. 目前 ...
- 如何利用 Python + Selenium 自动化快速截图
导读: Selenium 是一个可以让浏览器自动化地执行任务的工具,常用于自动化测试.与bs4等结合使用,也适合爬取动态网页数据.不过没想到,它居然可以用于网页截图,而且由于可编程性,用法更具想象空间 ...
- Python 3 怎么快速搭建服务器
Python 3 怎么快速搭建服务器 python 3 环境,我就不多说了 1.新建一个文件夹 2.放文件夹里一个 index.html 文件用来默认访问,不然会炸的 3.进入文件目录 4.执行以下命 ...
- 使用Python和OpenCV进行拍摄截图
使用Python和OpenCV进行拍摄截图 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何使用OpenCV,Python和PyAutoGui库拍摄截图. 使用pyautogui,可以轻 ...
- python使用heapq快速查找最大或最小的 N 个元素
python使用heapq快速查找最大或最小的 N 个元素 heapq实现了一个适合与Python的列表一起使用的最小堆排序算法. 堆是非线性的树形的数据结构,有两种堆,最大堆与最小堆.( heapq ...
- 记录一下:使用 python -m SimpleHTTPServer 快速搭建http服务
为什么80%的码农都做不了架构师?>>> 在 Linux 服务器上或安装了 Python 的机器上,Python自带了一个WEB服务器 SimpleHTTPServer. 我们 ...
- python新手教程 从零开始-Python零基础从零开始学习Python十分钟快速入门
原标题:Python零基础从零开始学习Python十分钟快速入门 学习Python的,都知道Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python是一种动态解释型的 ...
- python游戏编程书籍-《Python游戏编程快速上手》一1.3 如何使用本书
本节书摘来异步社区<Python游戏编程快速上手>一书中的第1章,第1.3节,作者: [美]Al Sweigart(斯维加特) 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区& ...
- python基础知识资料-Python基础知识快速学习系列视频课程
Python 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python是纯粹的自由软件, 源代码和解释器C ...
- 2021-03-10 Python多线程爬虫快速批量下载图片
Python多线程爬虫快速批量下载图片 1.完成这个需要导入的模块 urllib,random,queue(队列),threading,time,os,json 第三方模块的安装 键盘win+R,输入 ...
最新文章
- Seam的中文化支持
- android 比较两个list,比较两个List的内容是否相等
- Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询
- 从Github一开源项目ADSEC【学习域渗透攻防基础】
- TomCat服务器和Web应用
- Google Gson的使用方法及JSON 技术对比
- 2019年 第10届 蓝桥杯 Java B组 省赛真题详解及总结
- 租网站服务器安全吗,租用的服务器安全吗
- Nginx-rtmp直播之业务流程分析--比较详细
- 武汉游记,三件新鲜奇葩事
- SQL开头quoted和ansiNULL
- 第一款青少年搜索引擎“花漾搜索“APP正式上线
- php连接虚拟机中mysql数据库吗,PHP连接MySQL数据库的三种方式
- java mysql结果集_Java JDBC结果集的处理
- 网络安全实验3 漏洞扫描
- htcd816+android密码,详细的HTC Desire 816解锁教程
- 韩立刚计算机网络笔记-第01章 计算机网络详解
- 最小二乘法 来龙去脉
- 阿里云游戏服务器攻击怎么防御?
- ROS launch文件标签解释
热门文章
- 详解MATLAB/Simulink通信系统建模与仿真源码
- GWR学习笔记(一)
- 手把手教你使用人人开源
- 2-Python程序实例解析
- 2018最新Python数据分析实战教程视频 python数据分析班视频 Python数据分析基础教程 利用Python进行数据分析
- 铁路售票系统_城轨交通自动售检票(AFC)实训系统中心_地高铁车站票务实训如何建设...
- 如何自学生物信息学:从菜鸟到专家
- 贪吃蛇c语言作业ppt,c语言贪吃蛇
- http://www.myeclipseide.com/ 官网打不开的问题!myeclipse 官网!
- 计算机更新bios,升级bios,详细教您主板怎么更新bios