通用技术 仿豌豆荚效果的高性能安卓设备屏幕实时捕获工具

Archer · 2014年07月24日 · 最后由 虎卧荒丘 回复于 2014年07月24日 · 1688 次阅读
本帖已被设为精华帖!

欢迎 star 和 fork,Github 地址:https://github.com/testerhome/Android_Screen_Stream

Android_Screen_Stream

在无线自动化测试平台的搭建中,我们可能需要这样一个机器管理的场景:
在一个 portal 里,能够看到我们机器的一些基本情况,比如它是否在锁屏状态,运行是否正常。
如果能够看到屏幕回传的话......

工具优点

采用 ddmlib 高效截图方式,在 MAC 系统下效果尤佳,延时控制在 2-3 秒内

运行环境

需要 jython

依赖 jar 包

见代码顶端,自己调整一下

运行

jython screenshot.py

打开 demo.html

然后在目录中找到 demo.html 用 chrome 或者 Firefox 打开
你就可以欣赏到屏幕回传了。
不支持 IE9 以下浏览器......

效果展示

完整代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Android_ScreenSream by Archer
# Based on Jython,ddmlib,opencv,guava

#import jar
import sys,os
sys.path.append(r'C:\\ddmlib.jar')
sys.path.append(r'C:\\guava17.jar')
sys.path.append(r'C:\\rt.jar')
from threading import Thread

#import lib
from java.awt.image import *
from java.io import *
from javax.imageio import *
from com.android.ddmlib import *
from time import sleep

class AndroidScreenStream(object):

    def __init__(self):
        super(AndroidScreenStream,self).__init__()
        self.devices=[]
        self.currentdevice=None
        self.rawimgdata=None
        self.rawscreen=None

    def wait_device_lists(self,bridge):
        """获取设备列表信息"""
        count=0
        while(bridge.hasInitialDeviceList()==False):
            try:
                sleep(0.5)
                count+=1
            except:
                pass
            if(count>60):
                print "获取设备列表信息超时!"
                break

    def get_devices(self):
        """获取所有已连接设备"""
        AndroidDebugBridge.init(False)
        mybridge=AndroidDebugBridge.createBridge()
        self.wait_device_lists(mybridge) #get
        self.devices.append(mybridge.getDevices())
        return self

    def get_device_by_index(self,index):
        """根据index获取单个当前设备"""
        AndroidDebugBridge.init(False)
        mybridge=AndroidDebugBridge.createBridge()
        self.wait_device_lists(mybridge) #get
        try:
            self.currentdevice=mybridge.getDevices()[index]
            return self
        except IndexError:
            print "不存在序号为"+str(index)+"的设备,请检查USB连接!"
            sys.exit()

    def get_current_screen_imgbyes(self):
        """获取当前屏幕图像的字节数据"""
        self.rawimgdata=self.currentdevice.getScreenshot().data #保存图像字节数据
        return self

    def get_current_rawscreen(self):
        """保存当前屏幕screen对象"""
        self.rawscreen=self.currentdevice.getScreenshot()
        return self

    def save_screen_img(self,path=os.path.join(os.getcwd(),'current_frame.jpeg'),islandscape=False):
        """将当前屏幕图像数据保存为图片"""
        if self.rawscreen is not None:
            landscape=islandscape
            #横屏尺寸处理
            imgwidth=self.rawscreen.height if landscape else self.rawscreen.width
            imgheight=self.rawscreen.width if landscape else self.rawscreen.height
            image=BufferedImage(imgwidth,imgheight,BufferedImage.TYPE_INT_RGB)
            if image.getHeight()!=imgheight or image.getWidth()!=imgwidth:
                image=BufferedImage(imgwidth,imgheight,BufferedImage.TYPE_INT_RGB)
            index=0
            indexInc=self.rawscreen.bpp>>3
            for y in range(self.rawscreen.height):
                for x in range(self.rawscreen.width):
                    value=self.rawscreen.getARGB(index)
                    if landscape:
                        image.setRGB(y,self.rawscreen.width-x-1,value)
                    else:
                        image.setRGB(x,y,value)
                    index+=indexInc
            try:
                ImageIO.write(image,"JPEG",File(path))
            except IOError:
                print "发生异常!"
                sys.exit()
        else:
            print "rawscreen为空!"
            sys.exit()

if __name__=="__main__":
    ASS=AndroidScreenStream()
    ShotDevice=ASS.get_device_by_index(0)
    while True:
        ShotDevice.get_current_rawscreen().save_screen_img()
共收到 6 条回复 时间 点赞

正需要的这样的贴子,拿来在 java 中实践,非常赞 😄

链接已更新~

很赞

学习。。谢谢楼主分享!

你试过录制捕鱼达人和愤怒的小鸟吗, fps 会达到多少, 能顶得住吗

#5 楼 @seveniruby 这个方法肯定顶不住呀。。。。。

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