解决opendx在windows下无法使用scrcpy录屏
生活随笔
收集整理的這篇文章主要介紹了
解决opendx在windows下无法使用scrcpy录屏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 前言
- 一、解決的問題
- 二、使用步驟
- 1.opendx源碼下載
- 2.修改agent內容
前言
opendx是一款基于 appium 的自動化測試平臺。支持web端控制手機,整個架構設計非常優秀,可以根據公司業務,進行二次開發使用。
一、解決的問題
由于華為手機高版本無法使用appium自帶的錄制功能。所以opendx添加了scrcpy錄制功能,缺點是需要在agent端安裝scrcpy,且windows無法支持錄制。由于公司大多數同學使用windows,導致啟動的agent在高版本華為手機上無法錄制視頻,在用例結束后難以排查問題。
二、使用步驟
1.opendx源碼下載
下載地址
2.修改agent內容
ScrcpyVideoRecorder類代碼如下(示例):
package com.daxiang.core.mobile.android.scrcpy;import com.daxiang.core.Device; import com.daxiang.core.mobile.android.AndroidDevice; import com.daxiang.utils.Terminal; import com.daxiang.utils.UUIDUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils;import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit;/*** Created by jiangyitao.*/ @Slf4j public class ScrcpyVideoRecorder {private String mobileId;private String videoName;private boolean isRecording = false;private CountDownLatch countDownLatch;private Device device;private FileChannel fc;private Scrcpy scrcpy;private static final String H264 = ".h264";private static final String MP4 = ".mp4";public ScrcpyVideoRecorder(String mobileId,Device device) {this.mobileId = mobileId;this.device = device;}public synchronized void start() {if (isRecording) {return;}countDownLatch = new CountDownLatch(1);scrcpy = ((AndroidDevice) device).getScrcpy();try {videoName = UUIDUtil.getUUID();fc = new FileOutputStream(videoName+H264).getChannel();scrcpy.start(imgData -> {try {fc.write(imgData);} catch (IOException e) {}});isRecording = true;} catch (Exception e) {isRecording = false;throw new RuntimeException(e);}finally {countDownLatch.countDown();}}/*** 1. kill scrcpy server來停止錄制視頻是最優方案。但大多數安卓Mobile只能通過ps(非ps -ef)獲取到scrcpy server進程,* 此時的進程名為app_process, appium在Mobile里運行的進程也是app_process,所以可能會誤殺appium在Mobile里運行的進程,不采用該方法* 2. ExecuteWatchdog.destroyProcess()會導致最后一部分視頻無法寫入,* 因為運行在pc的scrcpy進程被直接干掉,無法寫入最終的視頻,導致獲取到破損的視頻* 3. 在非windows操作系統下,scrcpy收到kill信號后,會寫入最后一部分視頻,目前采用該方法* 4. 無法在windows上使用,windows taskkill和ExecuteWatchdog.destroyProcess()一樣*/public synchronized File stop() throws IOException {if (!isRecording) {throw new IllegalStateException("video is not in recording");}log.info("[{}]stop record video: {}", mobileId, videoName);scrcpy.stop();if (fc != null){fc.close();}String killScrcpyCmd = String.format("ffmpeg -f h264 -i %s.h264 -y -vcodec copy %s.mp4", videoName,videoName);Terminal.execute(killScrcpyCmd);try {// 等待視頻寫入完成,最多等3mincountDownLatch.await(3, TimeUnit.MINUTES);} catch (InterruptedException e) {throw new RuntimeException(e);}FileUtils.deleteQuietly(new File(videoName+H264));log.info("[{}]video: {} recording complete", mobileId, videoName);isRecording = false;return new File(videoName+MP4);} }AndroidDevice類代碼如下(示例):
@Overridepublic void startRecordingScreen() {if (canUseAppiumRecordVideo) {try {AndroidStartScreenRecordingOptions androidOptions = new AndroidStartScreenRecordingOptions();// Since Appium 1.8.2 the time limit can be up to 1800 seconds (30 minutes).androidOptions.withTimeLimit(Duration.ofMinutes(30));androidOptions.withBitRate(Integer.parseInt(App.getProperty("androidRecordVideoBitRate")) * 1000000); // default 4000000((AndroidDriver) driver).startRecordingScreen(androidOptions);return;} catch (Exception e) {log.warn("[{}]無法使用appium錄制視頻", getId(), e);canUseAppiumRecordVideo = false;}}if (scrcpyVideoRecorder == null) {scrcpyVideoRecorder = new ScrcpyVideoRecorder(getId(),this);}try {scrcpyVideoRecorder.start();}catch (Exception e){log.warn("[{}]無法使用scrcpy錄制視頻", getId(), e);}}修改以上兩個類后,agent端不需要安裝scrcpy,windows也支持錄制視頻
總結
以上是生活随笔為你收集整理的解决opendx在windows下无法使用scrcpy录屏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021 ICPC Southeaste
- 下一篇: 武大数理金融学计算机吗,武汉大学50名数