安卓录屏和图像对比

安卓录屏

原生录屏方式

最简单的安卓录屏方式是使用adb shell screenrecord命令,但是该方式有一个很大的缺点,即最多只能录屏3分钟,对于超出3分钟的录屏无能为力。

解决方法

  • 对安卓底层原生代码重新编译,设置可以录屏的时间
  • 可以录制多个3分钟的视频,最后拼接

那么如何保证一个视频在到达3分钟后,继续录制新的视频呢?

由于工作项目是基于Nodejs开发,而Nodejs又是单线程的,为了不让录屏操作卡住其余的操作,所以我们在Nodejs中使用了child_process模块。当时间到达3分钟但是视频还没有录完时,child_process.on()方法中的回调函数会产生相应的err,正常录完时,则会在child_process.exit()中正常退出。基于此,我们以err == null作为继续录制视频的逻辑判断,若err = null,表示一个3分钟的录制过程正常结束,可以递归进行下一个3分钟视频的录制,若err != null,表示对录制进行中止,录制视频结束。

minicap录屏方式

minicap是开发stf的大神编写的基于安卓底层开发的一个视频流工具。在stf中,其主要作用就是在web端同步手机上的屏幕,并进行相应的截图操作。

那能不能用minicap来录制视频呢,答案显然是可以的,怎么录呢?

  1. 通过将minicap方式截图的图像放置到某个文件夹中,图像的命名自增
  2. 通过导入fluent-fmpeg模块,以fmpeg的方式将连续截图进行结合,拼接成一个完成视频,之后删除所有截图

一个工程只能使用一个minicap进行。因此,在项目中,若需在回放中进行录屏(即在web端还有minicap进程),则使用安卓原生录屏方式,避免两个minicap进程产生冲突,若已生成的脚本需要在云测平台进行批量运行(没有web界面,即没有minicap进程),则可以以minicap进行全局录屏。

图像对比

模板匹配

模板匹配指的是使用opencv4nodejs中的matchTemplate方法,该方法相对于DHash算法而言精确度较高。模板匹配是指以一个名为模板的截图在整张大图中进行匹配,若满足阈值设置要求,则匹配成功,不满足则匹配失败。

模板匹配算法常用于:模板是否存在于给定图像的条件,无法满足模板在图像中相应位置的匹配

ImageDiff

像素级图像比较,其具体是指对两张图像的每一个像素值进行比较判断,这种主要适合同一台手机的图像比较。项目工程使用blink-Diff模块进行像素级图像比较,blink-Diff的优点是最后会输出两张图像不同的区域。

像素级图像比较相比于模板匹配,可以满足图像的位置匹配需求

Share