簡體   English   中英

如何在綁定到 CameraX 分析器的執行器中添加延遲?

[英]How to add a delay inside the Executor bound to CameraX's analyzer?

在我覆蓋的analyze()中,我需要在執行 IO 操作之前添加某種限制。 沒有節流閥,這個操作在每次調用analyze()時立即執行並且它實際上很快完成,但顯然調用太快了一段時間后相機預覽永遠凍結(應用程序仍在運行,因為 Logcat 不斷顯示新的消息)。

我目前正在調查它是否與我的代碼有關,例如忘記調用imageProxy.close() 到目前為止,一切似乎都很好,恐怕執行 IO 操作的設備引發了太多中斷,CPU 無法處理,或者類似的事情。

我已經嘗試過舊的Thread.sleep()但顯然它會阻塞主線程並凍結 UI; 我看過一些Handler#postDelayed()的例子,但我認為它沒有達到我想要的效果; 我已經嘗試將 IO 調用包裝在一個開頭帶有delay()的協程中,但我再次認為它沒有達到我想要的效果。 基本上我想在Executor線程本身上調用某種形式的sleep() ,從它執行的代碼中。

一段時間后,相機預覽會永久凍結

我已經多次看到此問題發生,通常是由於Analyzer未關閉圖像。 即使不使用圖像分析用例,您是否也看到了問題?

我已經嘗試過舊的 Thread.sleep() 但顯然它阻塞了主線程並凍結了 UI

為什么? 如果您在Analyzer.analyze()中添加對Thread.sleep()的調用,則不應出現這種情況,因為它會阻塞您在調用ImageAnalysis.setAnalyzer()時提供的Executor的線程,這應該' t 綁定到主線程。

減少執行分析次數的一種選擇是將圖像放入Analyzer中,如下所示:

private static final int ANALYSIS_DELAY_MS = 1_000;
private static final int INVALID_TIME = -1;
private long lastAnalysisTime = INVALID_TIME;

public void analyze (ImageProxy image) {
  final long now = SystemClock.uptimeMillis();

  // Drop frame if an image has been analyzed less than ANALYSIS_DELAY_MS ms ago
  if (lastAnalysisTime != INVALID_TIME && (now - lastAnalysisTime < ANALYSIS_DELAY_MS)) {
    image.close();
  }

  lastAnalysisTime = now;
  
  // Analyze image
  image.close();
}

還有一種方法,這就是我在本地項目中的做法。 因此,在我的圖像分析器中,我使用 Handler#PostDelayed 重新綁定相機,這會在預覽中顯示一個小黑屏,但它不會那么快地處理下一張圖像。

我的用例是我必須連續掃描條形碼,但是掃描速度太快並且一直在多次掃描一個代碼。 所以,我只需要 100 毫秒的等待時間。 所以這對我有用。

try {
    cameraProvider.unbindAll()
    Handler(Looper.getMainLooper()).postDelayed({
         cameraProvider.bindToLifecycle(
             this, CameraSelector.DEFAULT_BACK_CAMERA, useCaseGroup.build())
    }, 100)
}
catch(exc: Exception) {
     Log.e(TAG, "Use case binding failed", exc)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM