安卓录屏
原生录屏方式
最简单的安卓录屏方式是使用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来录制视频呢,答案显然是可以的,怎么录呢?
- 通过将minicap方式截图的图像放置到某个文件夹中,图像的命名自增
- 通过导入fluent-fmpeg模块,以fmpeg的方式将连续截图进行结合,拼接成一个完成视频,之后删除所有截图
一个工程只能使用一个minicap进行。因此,在项目中,若需在回放中进行录屏(即在web端还有minicap进程),则使用安卓原生录屏方式,避免两个minicap进程产生冲突,若已生成的脚本需要在云测平台进行批量运行(没有web界面,即没有minicap进程),则可以以minicap进行全局录屏。
图像对比
模板匹配
模板匹配指的是使用opencv4nodejs中的matchTemplate
方法,该方法相对于DHash算法
而言精确度较高。模板匹配是指以一个名为模板的截图在整张大图中进行匹配,若满足阈值设置要求,则匹配成功,不满足则匹配失败。
模板匹配算法常用于:模板是否存在于给定图像的条件,无法满足模板在图像中相应位置的匹配
ImageDiff
像素级图像比较,其具体是指对两张图像的每一个像素值进行比较判断,这种主要适合同一台手机的图像比较。项目工程使用blink-Diff
模块进行像素级图像比较,blink-Diff
的优点是最后会输出两张图像不同的区域。
像素级图像比较相比于模板匹配,可以满足图像的位置匹配需求