测试基础 视频流技术为手机远程租用带来全新体验——解决 minicap 痛点

opentest-oper@360.cn · 2018年12月13日 · 最后由 Byb 回复于 2020年03月27日 · 8064 次阅读

一、真机租用

360 开测真机租用:真机租用是一个云手机平台,用户可以远程操控真机,平台提供了常用的安装、截图、logcat、adb shell、远程调试等功能。

二、问题概述

真机租用的图片与点击功能使用的是 stf 提供的两个工具 minicap 与 minitouch。
当 Android P 系统发布时,由于 minicap 还未发布针对 Android P 版本的 minicap 与 minitouch 文件,导致所购新机无法及时上线供测试者使用。
注:两款工具的使用都和系统版本有关,不同 Android 版本对应于不同的工具文件,为解决上述严重依赖问题,我们进行了以下分析。

三、问题分析

minicap:负责手机图片的图片显示,即能看到真机的屏幕信息和状态
minitouch:负责手机的位置点击、滑动等 UI 操作
这两个工具根据 google 发布的 Android 版本一一对应不同的工具文件。
当新的 Android 发布时,minicap 和 minitouch 的适配版本还未及时发布,这个时候就会影响用户的体验,新系统就无法正常提供使用。
minitouch 可通过 jar 包服务(基于 uiautomator)来替代,来实现 minitouch 提供的所有点击、触控功能;但 minicap 要用什么来替代呢?

四、解决方案

采取视频流的方式替代 minicap;minicap 以图片的方式传递图像信息,而视频流用的是视频流的方式。
注:stf 的作者也在尝试将 minicap 图片的方式转换为视频的方式去获取远端手机图像。

五、实现的效果


 实时操作:界面清晰流畅、无卡顿现象

六、优势

①、视频流的新应用场景
视频流的常见用法在视频聊天、直播等使用较多,在这种交互测试上使用较少。该方案打开了另一扇视频流的使用大门。

②、远程租用平台无需依赖和 Android 版本匹配的工具(需要发布者发布某 Android 版本才可用)

③、上线新机、升级新版本成本降低(无需进行 Android 版本的适配测试,多个版本用一个版本工具)

④、在 Google 发布基础上,定制化获取视频流 jar 工具。

⑤、minicap 使用的截图 API 是 android 私有 API,被封的风险高;视频流使用的是公开 API,风险低!

⑥、视频流是局部传递图像信息,只有当某块区域发生变化时才传递,网络传输数据量小。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
最佳回复

有没有什么办法可以收集到系统的声音?

看描述是拿到 framebuffer 做实时编码?这是肯定要占用不少系统负载啊,而且传输画面的延迟是多少呢?

共收到 34 条回复 时间 点赞

能否详细说下视频流技术是怎么实现的呢?是否有现有的工具?

用的安装 apk 录屏推流?还是和 minicap 一样,编译成 Android 可执行文件呀?能有点细节的东西就好了~

YueChen 回复

用的 scrcpy jar 包拿到手机的屏幕流信息

剪烛 回复

具体就是拿到手机的流信息,然后在 web 端处理流数据显示。用的是 scrcpy 开源 jar 包

xiaozhi_said 回复

我搜 scrcpy,搜到是 python 的爬虫,应该如何搜索?

360 麻烦你简单说下如何实现视频流的抓取啊

光发了一个实现了 xxx 的 changlog

群主是狗 回复


获取到数据后根据 h264 视频格式做下解析

群主是狗 回复

具体实现方案详细细节后面会发文章

目测下篇文章可以加精,⛽️加油

我试了下和系统自带的 screenrecord 对比,录制一个静止一分钟视频文件会大很多。
我想可能是动态码率的问题?所以是不是还需要一层服务去对 scrcpy 的视频流做处理,不然占用带宽太高也没法实用。。。

另外文中说的不需要适配?我看了下这里感觉也是用了私有 API 啊。。。https://github.com/Genymobile/scrcpy/blob/master/DEVELOP.md#hidden-methods

edsion 回复

可以修改 scrcpy 里面的部分,对图片做分辨率降低处理,用的是 MidiaCodec 实现的,不需要适配。(支持 Android5.0 以上)

看描述是拿到 framebuffer 做实时编码?这是肯定要占用不少系统负载啊,而且传输画面的延迟是多少呢?

浮云 回复

拿到 framebuffer 只做解码处理,此步骤是为了将数据转化为 web 端播放的数据格式,传输画面的效果和 minicap 差不多,延迟小于、等于 0.2 秒。而且从最终结果来看,视频流的方式比 minicap 在网络传输上字节更少。

用的是直播的思想。

sanbo 回复

是的

我看了下那个 scrcpy 只能支持 5.0 以上,你们是只针对 5.0 以上做了相应的修改吗?

群主是狗 回复

我们目前只针对 Android9 的使用视频流方式,Android9 以下的用的还是 minicap 的方式

有没有什么办法可以收集到系统的声音?

我们也实现了,不过 boradway 和 h264 好像针对 1080x1920 的视频解析好像有 bug。现在我们都统一用的 720x1280。

啥时候能发下具体实现方案详细细节?😔 😔

edsion 回复

主要是视频的屏幕尺寸参数,是可以减少的。

adfghzhang 回复

我们目前没有使用手机的原始屏幕尺寸,多交流。

zzZZZ 回复

scrcpy 有收集收集音频的方案。基于 android 的 aoa 协议

已经解决了,Android 和 iOS 的远控 demo 都测试 OK 了,多谢

adfghzhang 回复

iOS 上使用的什么呢?

9楼 已删除

大哥,如何拿到手机发过来的信息呀

我能够很好的,无延时的获取 h264 数据并展示到 web 上,但是我现在需要删除 stf 中 minicap 模块,请问有什么好的建议吗,谢谢

6楼 已删除
adfghzhang 回复

我现在也有遇到这个问题,请问大神你是怎么解决的?

你好,屏幕尺寸你们是怎么处理的呢?我这边发现除了 720X1080,其他的分辨率播放都有一些问题。

adfghzhang 回复

大佬 能否共享下 demo

仅楼主可见
xiaozhi_said 回复

大佬,pc 用 socket 怎么拿到视频流呀?

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