У меня есть приложение камеры, у которого есть две выходные целевые поверхности, одна для 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 так, как я это сделал?Или мой код просто неверен?