Получение «Ошибка во время updateTexImage» при использовании ImageWriter для записи изображений в SurfaceTexture - PullRequest
0 голосов
/ 15 марта 2019

У меня есть приложение камеры, у которого есть две выходные целевые поверхности, одна для ImageReader for Analysis и Поверхность SurfaceTexture.Однако, когда я использую оба в качестве цели для CaptureRequestBuilder (или, что еще хуже, два отдельных CaptureRequest), производительность очень плохая с ощущением 5-10 кадров в секунду в каждом выходном потоке.Поэтому, чтобы решить, что я использую ImageWriter (по крайней мере, это была моя идея), который записывает изображения на поверхность SurfaceTexture в обратном вызове onImageAvaiableListener () ImageReader:

mImageWriter = ImageWriter.newInstance(surface, 1); 
mImageReader = ImageReader.newInstance(1280, 720, PixelFormat.RGBA_8888, 1);

 try {
        final CaptureRequest.Builder captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
        captureRequestBuilder.addTarget(mImageReader.getSurface());
        session.setRepeatingRequest(captureRequestBuilder.build(),  new CameraCaptureCallback(), cameraThreadHandler);
} catch (CameraAccessException e) {
    reportError("Failed to start capture request. " + e);
    return;
  }

localListener= new ImageReader.OnImageAvailableListener() {
  @Override
  public void onImageAvailable(ImageReader imageReader) {
    Image image = imageReader.acquireLatestImage();
    mImageWriter.queueInputImage(image);
  }
};

mImageReader.setOnImageAvailableListener(localListener, null);

Теперь, насколько я понимаю, это должно работатьточно так же, как если бы отдельный CapturerRequestBuilder был сделан с «поверхностью» в качестве цели.Однако при выполнении я получаю следующую ошибку в функции updateTexImage SurfaceTexture:

E/GLConsumer: [SurfaceTexture-1-20518-1] doGLFenceWait: error dup'ing fence fd: 9

    --------- beginning of crash
03-14 23:08:48.246 20518-20750 E/AndroidRuntime: FATAL EXCEPTION: main

    java.lang.RuntimeException: Error during updateTexImage (see logcat for details)
        at android.graphics.SurfaceTexture.nativeUpdateTexImage(Native Method)
        at android.graphics.SurfaceTexture.updateTexImage(SurfaceTexture.java:240)
        at org.webrtc.SurfaceTextureHelper.updateTexImage(SurfaceTextureHelper.java:266)
        at org.webrtc.SurfaceTextureHelper.tryDeliverTextureFrame(SurfaceTextureHelper.java:280)
        at org.webrtc.SurfaceTextureHelper.lambda$new$0(SurfaceTextureHelper.java:137)
        at org.webrtc.-$$Lambda$SurfaceTextureHelper$7YTfC0byyd0o_zI7mNhfP12Gm0Q.onFrameAvailable(lambda)
        at android.graphics.SurfaceTexture$1.handleMessage(SurfaceTexture.java:203)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.os.HandlerThread.run(HandlerThread.java:61)

Может кто-нибудь объяснить мне, что вообще означает эта ошибка и как я могу ее решить?Можно ли даже написать изображения в SurfaceTexture так, как я это сделал?Или мой код просто неверен?

...