Appium Mobile 端视屏录制脚本 (adb | idb+ffmpeg)

bou瓜 · 2023年09月11日 · 最后由 bou瓜 回复于 2023年09月12日 · 4880 次阅读

由于前段时间使用 Appium 跑 cases 的时候,发现用 Appium 录制手机的视频时间很短(不超过 3 分钟)。
原帖:https://testerhome.com/topics/37353

根据官方建议修改后,发现问题还是没有解决。于是就谷歌一下 Mobile 端怎么录视频,发现有人用 adb+ffmpeg 的命令实现:

adb shell "while true; do screenrecord --output-format=h264 -; done" | ffmpeg -i - -s 1440x2560 -framerate 30 -bufsize 16M secondString16.mp4

地址:https://stackoverflow.com/questions/21938948/how-to-increase-time-limit-of-adb-screen-record-of-android-kitkat
复制过来尝试一下,发现输出的视频画面依托,就放下了一段时间。

后来又需要录制视频功能了,重新拿出来尝试,最后把 adb shell 换成 adb exec-out 就能得到正常的视频了。
于是写进代码里面:

运行完用例脚本之后,发现视频打不开,而且视频的内存还在不停增大。于是百度找了方法输出进程执行的信息,结果日志输出:脚本已经结束,adb+ffmpeg 的进程还在继续运行,根本停不下来(代码最后有调用 Process.destoy 方法)。尝试用 taskkill 命令终止 adb 进程都没有效果。最终由同事调试,用 adb kill-server 完美解决进程停不了的问题。

至于 ios 端,同理,找到类似工具 idb(官网也有视频录制的介绍,不过 appium 跑脚本前,一定要用 idb connect 连接手机和保证 idb-companion 正常运行)。代码实现也和上面的差不多:

idb video-stream --fps 30 --format h264 --compression-quality 1.0 --udid udid | ffmpeg -i - -f h264 -b 900k -framerate 30 secondString.mp4

进程终止的问题,可以通过反射拿到进程的 pid,然后再 pkill(不用 kill 的理由是 kill 不能完全终止子进程)

除了上面遇到的问题,用 idb 脚本录制视频时会中断 wda 的 session,导致 appium 抛出 Connection Lost 的异常。在 github 咨询了一下,建议把 idb 脚本放在创建 session 之前执行。
还有输出的视频不能快进拖动进度条等问题,与 ffmpeg 输出的视频格式有关,最后还需要用 ffmpeg -i 转换视频格式,
windows 端:mp4->avi
Mac 端:mp4->mov

共收到 2 条回复 时间 点赞

楼主牛逼,请问下要是多设备并行,adb kill-server 是不是就会把所有设备的 adb 相关进程结束

IAmTester 回复

未试过并行测试,你说的情况是可能发生的。

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