首页 > 解决方案 > ARCore 发布图片导致崩溃

问题描述

我正在运行 hello_ar_c 示例。当我尝试获取当前的 CPU 映像时,如果我随后释放它,应用程序就会崩溃。

void HelloArApplication::OnDrawFrame() {
  // Render the scene.
  glClearColor(0.9f, 0.9f, 0.9f, 1.0f);
  glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

  glEnable(GL_CULL_FACE);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

  if (ar_session_ == nullptr) return;

  ArSession_setCameraTextureName(ar_session_,
                                 background_renderer_.GetTextureId());

  // Update session to get current frame and render camera background.
  if (ArSession_update(ar_session_, ar_frame_) != AR_SUCCESS) {
    LOGE("HelloArApplication::OnDrawFrame ArSession_update error");
  }

  ArCamera* ar_camera;
  ArFrame_acquireCamera(ar_session_, ar_frame_, &ar_camera);

  ArImage* ar_image;
  ArFrame_acquireCameraImage(ar_session_, ar_frame_, &ar_image);

  ArImage_release(ar_image);

这是堆栈跟踪:

2020-03-15 18:27:32.211 818-6317/? I/cie: FaceStoryAlgo::isCurFrameRun isCurFrameRun. Process mode 0.  
2020-03-15 18:27:32.212 818-1473/? I/AlgoEvent: [HWA_CAM3]yuv tracking rect[0 0 0 0] raw tracking rect[0 0 0 0] 
2020-03-15 18:27:32.212 818-6311/? D/Misc____: [0b99617d_64D] onProcessFrame(666), afDistance(0.000000)
2020-03-15 18:27:32.212 656-656/? I/mediacomm@2.1-service: getMdcClient:114: get client<Camera, 117, 818>, channel<4, 1>, perfLev=2, powerStatue=0. 
2020-03-15 18:27:32.212 656-656/? I/mediacomm@2.1-service: getMdcVotePerfLev:179: Connected Mdc client<Camera, 117, 818> channel<4, 1> perfLev<2> 
2020-03-15 18:27:32.213 800-1480/? E/Surface: queueBuffer: error queuing buffer to SurfaceTexture, -32 
2020-03-15 18:27:32.213 800-1480/? E/Camera3-OutputStream: returnBufferCheckedLocked: Stream 1: Error queueing buffer to native window: Broken pipe (-32) 
2020-03-15 18:27:32.213 800-1480/? E/Camera3-Device: Can't return buffer to its stream: (0xe9921480), error: Broken pipe (-32) 
2020-03-15 18:27:32.215 656-656/? I/mediacomm@2.1-service: doCopybit:495: client<Camera, 0> ret = 818 finish copybit -. 
2020-03-15 18:27:32.215 818-6320/? I/GRALLOC: LockFlexLayout: baseFormat: 11, yStride: 640, ySize: 307200, uOffset: 307200,  uStride: 640 
2020-03-15 18:27:32.215 818-6320/? I/GRALLOC: LockFlexLayout: baseFormat: 11, yStride: 640, ySize: 307200, uOffset: 307200,  uStride: 640 
2020-03-15 18:27:32.215 800-1480/? E/Surface: queueBuffer: error queuing buffer to SurfaceTexture, -32 
2020-03-15 18:27:32.215 800-1480/? E/Camera3-OutputStream: returnBufferCheckedLocked: Stream 0: Error queueing buffer to native window: Broken pipe (-32) 
2020-03-15 18:27:32.215 800-1480/? E/Camera3-Device: Can't return buffer to its stream: (0xe9923700), error: Broken pipe (-32) 
2020-03-15 18:27:32.228 818-6308/? I/HwaStatInfo: [0b99617d_64I] algotype is 0, videoRatio is 1.000000, ratio is 2.666667, faceNum is 0 
2020-03-15 18:27:32.228 818-6322/? I/afstatAlgo: do_afstat_num:0,flow =0, aftype:0, focus_stage = 0,focus_scene:0 fv[code:0 normalFV:0, peakHoldFV:0],frame_rect[0, 0], focus_rect[0 0 0 0] 
2020-03-15 18:27:32.245 818-6317/? I/EnvImpl: [HWA_CAM3]getArCalorieMode mArCalorieMode 0 
2020-03-15 18:27:32.245 818-6315/? I/YuvCalculate: mono_mode: 0, ae_stable: [1, 0], colorDis: 1, buf_cnt:1 
2020-03-15 18:27:32.245 818-6317/? I/cie: FaceStoryAlgo::isCurFrameRun isCurFrameRun. Process mode 0.  
2020-03-15 18:27:32.245 818-6311/? D/Misc____: [0b99617d_64D] onProcessFrame(666), afDistance(0.000000) 
2020-03-15 18:27:32.245 818-1473/? I/AlgoEvent: [HWA_CAM3]yuv tracking rect[0 0 0 0] raw tracking rect[0 0 0 0] 
2020-03-15 18:27:32.246 656-656/? I/mediacomm@2.1-service: getMdcClient:114: get client<Camera, 117, 818>, channel<4, 1>, perfLev=2, powerStatue=0. 
2020-03-15 18:27:32.246 656-656/? I/mediacomm@2.1-service: getMdcVotePerfLev:179: Connected Mdc client<Camera, 117, 818> channel<4, 1> perfLev<2>

当我注释掉释放图像的行时,程序运行,背景在屏幕上正确呈现,但堆栈跟踪返回:

2020-03-15 18:34:27.753 800-6919/? I/Camera3-Stream: getBuffer: Stream 1, 0xe9921300: Already dequeued max output buffers (7), wait for next returned one.
2020-03-15 18:34:27.754 6723-6818/com.google.ar.core.examples.c.helloar E/native: cpu_image_manager.cc:260 Failed to acquire new image, due to too many images acquired but not released.
2020-03-15 18:34:27.754 6723-6818/com.google.ar.core.examples.c.helloar E/native: status.cc:156 RESOURCE_EXHAUSTED: 
ARCoreError: third_party/arcore/ar/core/cpu_image_manager.cc:262
 [type.googleapis.com/util.ErrorSpacePayload='ArStatusErrorSpace::AR_ERROR_RESOURCE_EXHAUSTED']

如果没有发布任何图像,我希望 AR_ERROR_RESOURCE_EXHAUSTED 会出现。我只是不确定为什么当我尝试发布图像时,我会遇到应用程序崩溃。

标签: androidc++android-ndkarcore

解决方案


想出了这个:

if (ArFrame_acquireCameraImage(ar_session_, ar_frame_, &ar_image) == AR_SUCCESS) {
      ArImageFormat ar_image_format;
      ArImage_getFormat(ar_session_, ar_image, &ar_image_format);
      ArImage_release(ar_image);
  }

没有 if 语句(或 try 可能)的代码多次尝试释放图像;这,使应用程序崩溃。


推荐阅读