java - 在 Camera2 api 上使用 captureBurst 时 JPEG 回调超时

标签 java c# android mono android-camera

我正在使用camera2 api从captureBurst中获取一堆图像。 该应用程序是camera2basic 的略微修改版本。

图像读取器已声明:

ImageReader multiReader = ImageReader.NewInstance(width, height, ImageFormatType.Jpeg, 10);

我正在使用这个cameraCaptureCallback:

private class CameraCaptureStateListener: CameraCaptureSession.StateCallback
{

    public Action<CameraCaptureSession> OnConfigureFailedAction;
    public override void OnConfigureFailed (CameraCaptureSession session)
    {
        if (OnConfigureFailedAction != null) 
        {
            OnConfigureFailedAction (session);
        }
    }
    public Action<CameraCaptureSession> OnConfiguredAction;
    public override void OnConfigured(CameraCaptureSession session)
    {
        if(OnConfiguredAction != null)
        {
            OnConfiguredAction(session);
        }
    }
}

这是捕获 session :

mCameraDevice.CreateCaptureSession(outputSurfaces, new CameraCaptureStateListener()
{
    OnConfiguredAction = (CameraCaptureSession session) => {
        try 
        {
            List<CaptureRequest> requests = new List<CaptureRequest>();
            for(int i = 0; i < 10; i++)
            {
                requests.Add(crBuilder.Build());
                Log.Debug("CaptureRequest", "Added new captureRequst");
            }
                session.CaptureBurst(requests, captureListener, backgroundHandler);
                Toast.MakeText (activity, "BurstCapture Complete", ToastLength.Long).Show ();
        }
        catch (CameraAccessException ex)
        {
            Log.WriteLine(LogPriority.Info, "Capture Session error: ", ex.ToString());
        }
    }
}, backgroundHandler );

这是我的错误日志:

[Adreno-EGL] <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1.1_RB1.05.00.02.042.016_msm8974_LA.BF.1.1.1_RB1__release_AU ()
[Adreno-EGL] OpenGL ES Shader Compiler Version: E031.25.03.00
[Adreno-EGL] Build Date: 02/11/15 Wed
[Adreno-EGL] Local Branch: mybranch7539026
[Adreno-EGL] Remote Branch: quic/LA.BF.1.1.1_rb1.10
[Adreno-EGL] Local Patches: NONE
[Adreno-EGL] Reconstruct Branch: AU_LINUX_ANDROID_LA.BF.1.1.1_RB1.05.00.02.042.016 + 62ca4eb + acd831d + 9f8b442 + e027a02 + cba30ba + 53c303a + a649d79 + 23e16f8 + 5e97da7 + cbd2a44 + 33d072a + 7aacf06 + 72b33e7 + 28f6f60 + b4c13d8 +  NOTHING
[OpenGLRenderer] Initialized EGL, version 1.4
[OpenGLRenderer] Enabling debug mode 0
[CameraDeviceState] Legacy camera service transitioning to state CONFIGURING
[RequestThread-0] Configure outputs: 1 surfaces configured.
[Camera] app passed NULL surface
[CameraDeviceState] Legacy camera service transitioning to state IDLE
[CameraFragment: CameraCharacteristics] lensFocusDistanceCalibration = 
[RequestQueue] Repeating capture request set.
[LegacyRequestMapper] convertRequestMetadata - control.awbRegions setting is not supported, ignoring value
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[CameraDeviceState] Legacy camera service transitioning to state CAPTURING
[BufferQueueConsumer] [unnamed-24394-2] setMaxAcquiredBufferCount: invalid count 1000
[RequestQueue] Repeating capture request cancelled.
[CameraDeviceState] Legacy camera service transitioning to state IDLE
[CameraDeviceState] Legacy camera service transitioning to state CONFIGURING
[RequestThread-0] Configure outputs: 2 surfaces configured.
[Camera] app passed NULL surface
[RequestThread-0] configureOutputs - set take picture size to 4160x3120
[CameraDeviceState] Legacy camera service transitioning to state IDLE
[Choreographer] Skipped 1381 frames!  The application may be doing too much work on its main thread.
Thread started:  #3
[Mono] DllImport attempting to load: '/system/lib/libc.so'.
[Mono] DllImport loaded library '/system/lib/libc.so'.
[Mono] DllImport searching in: '/system/lib/libc.so' ('/system/lib/libc.so').
[Mono] Searching for 'gettid'.
[Mono] Probing 'gettid'.
[Mono] Found as 'gettid'.
[CaptureRequest] Added new captureRequst
[CaptureRequest] Added new captureRequst
[CaptureRequest] Added new captureRequst
[CaptureRequest] Added new captureRequst
[CaptureRequest] Added new captureRequst
[CaptureRequest] Added new captureRequst
[CaptureRequest] Added new captureRequst
[CaptureRequest] Added new captureRequst
[CaptureRequest] Added new captureRequst
[CaptureRequest] Added new captureRequst
[LegacyRequestMapper] convertRequestMetadata - control.awbRegions setting is not supported, ignoring value
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[RenderScript] Application requested CPU execution
[RenderScript] 0xb8382058 Launching thread(s), CPUs 4
[CameraDeviceState] Legacy camera service transitioning to state CAPTURING
[RequestThread-0] Received jpeg.
[RequestThread-0] Producing jpeg buffer...
[ImageReader_JNI] ImageReader_imageSetup: Receiving JPEG in HAL_PIXEL_FORMAT_RGBA_8888 buffer.
[LegacyRequestMapper] convertRequestMetadata - control.awbRegions setting is not supported, ignoring value
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[RequestThread-0] Received jpeg.
[RequestThread-0] Producing jpeg buffer...
[LegacyRequestMapper] convertRequestMetadata - control.awbRegions setting is not supported, ignoring value
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[RequestThread-0] Received jpeg.
[RequestThread-0] Producing jpeg buffer...
[LegacyRequestMapper] convertRequestMetadata - control.awbRegions setting is not supported, ignoring value
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[RequestThread-0] Received jpeg.
[RequestThread-0] Producing jpeg buffer...
[RequestThread-0] Hit timeout for jpeg callback!
[LegacyRequestMapper] convertRequestMetadata - control.awbRegions setting is not supported, ignoring value
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[RequestThread-0] Hit timeout for jpeg callback!
[RequestHolder] Capture failed for request: 1
[LegacyRequestMapper] convertRequestMetadata - control.awbRegions setting is not supported, ignoring value
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[RequestThread-0] Hit timeout for jpeg callback!
[RequestHolder] Capture failed for request: 1
[LegacyRequestMapper] convertRequestMetadata - control.awbRegions setting is not supported, ignoring value
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[RequestThread-0] Hit timeout for jpeg callback!
[RequestHolder] Capture failed for request: 1
[LegacyRequestMapper] convertRequestMetadata - control.awbRegions setting is not supported, ignoring value
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[RequestThread-0] Hit timeout for jpeg callback!
[RequestHolder] Capture failed for request: 1
[LegacyRequestMapper] convertRequestMetadata - control.awbRegions setting is not supported, ignoring value
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[RequestThread-0] Hit timeout for jpeg callback!
[RequestHolder] Capture failed for request: 1
[LegacyRequestMapper] convertRequestMetadata - control.awbRegions setting is not supported, ignoring value
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[LegacyRequestMapper] Only received metering rectangles with weight 0.
[RequestThread-0] Hit timeout for jpeg callback!
[RequestHolder] Capture failed for request: 1
[CameraDeviceState] Legacy camera service transitioning to state IDLE
[CameraDeviceState] Legacy camera service transitioning to state CONFIGURING
[RequestThread-0] Configure outputs: 1 surfaces configured.
[Camera] app passed NULL surface
[CameraDeviceState] Legacy camera service transitioning to state IDLE
[ImageReader_JNI] ImageReader_imageSetup: Receiving JPEG in HAL_PIXEL_FORMAT_RGBA_8888 buffer.
[ImageReader_JNI] ImageReader_imageSetup: Receiving JPEG in HAL_PIXEL_FORMAT_RGBA_8888 buffer.
[Legacy-CameraDevice-JNI] produceFrame: Pixel buffer needs size 1529528, cannot fit in gralloc buffer of size 1248
[Legacy-CameraDevice-JNI] LegacyCameraDevice_nativeProduceFrame: Error while producing frame Invalid argument (-22).
Thread started:  #4

另外仅供引用,这是来自 Xamarin Studio,这就是为什么它是用 C# 而不是 Java 编写的

看来,因为我使用 xamarin 来单步执行代码,所以它没有停止所有线程,这导致 Activity 线程(已停止)和 jpeg 缓冲区之间出现竞争条件,从而导致 jpeg回调错误。

最佳答案

在您的 Camera 2 API View 中修改此行

imageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(),ImageFormat.JPEG, 2);

关于java - 在 Camera2 api 上使用 captureBurst 时 JPEG 回调超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31946796/

相关文章:

java - 尝试在 Android 应用程序中随机化几个问题时出错

android - 如何使用类似 UI materializecss 框架的 android 设计?

c# - 在使用 async/await 进行请求时为多个函数调用返回相同的值

c# - 与宽高比匹配的最小尺寸

java - 复选框右对齐

java - 新行中的 BufferedWriter 数组元素

java - 验证异常 : "The provided key element does not match the schema" Error when doing dynmoDB batchWriteItem operation

java - JPA+Hibernate - 实体关系中的循环 - 级联策略

java - 如何从其他类访问一个类的属性?

c# - 接口(interface) : Setter without a Getter