android - 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 会出现。我只是不确定为什么当我尝试发布图像时,我会遇到应用程序崩溃。
解决方案
想出了这个:
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 可能)的代码多次尝试释放图像;这,使应用程序崩溃。
推荐阅读
- excel - 如何为格式错误的地址添加分隔符?
- parsing - 使用 awk 在 $4 和 $5 之间添加一列
- java - 从 Java 应用程序(服务器-客户端)接收数据并将它们显示为 Android 应用程序中的通知
- port - listening port not allowing the connection
- node.js - Cant assign values from a json response in angular 6
- c# - 无法打开本地主机(ERR_CONNECTION_ABORTED)
- reactjs - 解决与 Expo 和 React Native 的依赖冲突
- machine-learning - which class is positive and how to determine real alarm in preparing data for ML
- mongodb - 如何提高MongoDB的搜索性能?
- python - Is there a cleaner Python version of my code for Euler Practice