【问题标题】:Process hosting the camera service has died unexpectedly托管相机服务的进程意外死亡
【发布时间】:2016-07-13 13:15:48
【问题描述】:

我已经尝试了所有方法,但找不到我的相机应用程序向我抛出服务异常的原因。

情况就是这样。我正在使用一个 HDR jni 库,我已经检查过它并且工作正常,它不是本机内存的内存引导,也不是 jni 问题。所以,问题一定出在我的代码中:

我只是在等待 CaptureResult 返回一个 AE_CONVERGED_STATE 以检查传感器是否已经进行了正确的曝光,然后我调用我的方法:

    Log.performanceEnd("YUV capture");
        Log.d(TAG, "[onImageAvailable] YUV capture, mBurstCount: " + mBurstCount);
        Image image = imageReader.acquireNextImage();
        if (mBackgroundHandler != null) {
            mBackgroundHandler.post(new YuvCopy(image, mBurstCount));
        }
        mBurstCount++;

        if (mBurstState == BURST_STATE_HDR) {
            switch (mBurstCount) {
                case 1:
                    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, HDR_EXPOSURE_COMPENSATION_VALUE_HIGH);
                    break;
                case 2:
                    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, HDR_EXPOSURE_COMPENSATION_VALUE_LOW);
                    break;
                case 3:
                    //Restore exposure compensation value
                    mCaptureCallback = mPhotoCaptureCallback;
                    mSettingsManager.setExposureCompensation(mPreviewRequestBuilder);
                    mActivity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            onPictureCaptured();
                        }
                    });
                    unlockFocus();
                    break;
            }
            if (mBurstCount != 3) {
                updatePreviewSession();
            }
            //Finish HDR session
            if (mBurstCount < YUV_BURST_LIMIT) mHdrState = STATE_PICTURE_TAKEN;
        }

这是我的 YUV 方法:

 /**
 * Transform YUV420 to NV21 readable frames
 */
private class YuvCopy implements Runnable {
    private final Image mImage;
    private final int mPictureIndex;

    public YuvCopy(Image image, int index) {
        mImage = image;
        mPictureIndex = index;
    }

    @Override
    public void run() {
        if (mImage != null) {
            if (mImage.getWidth() * mImage.getHeight() > 0) {
                Image.Plane[] planes = mImage.getPlanes();                   

                long startCopy = System.currentTimeMillis();

                int width = mImage.getWidth();
                int height = mImage.getHeight();
                int ySize = width * height;
                ByteBuffer yBuffer = mImage.getPlanes()[0].getBuffer();
                ByteBuffer uvBuffer = mImage.getPlanes()[1].getBuffer();
                ByteBuffer vuBuffer = mImage.getPlanes()[2].getBuffer();
                byte[] mData = new byte[ySize + (ySize / 2)];
                yBuffer.get(mData, 0, ySize);
                vuBuffer.get(mData, ySize, (ySize / 2) - 1);
                mData[mData.length - 1] = uvBuffer.get(uvBuffer.capacity() - 1);
                mImage.close();

                mHdrCaptureArray[mPictureIndex] = mData;

                Log.i(TAG, "[YuvCopy|run] Time to Copy data: " + (System.currentTimeMillis() - startCopy) + "ms");

                if (mPictureIndex == YUV_BURST_LIMIT - 1) {
                    startHdrProcessing();

                } else {
                    mImage.close();
                }

            }
        }
    }

我一共选择了三张照片,然后我调用了我的 JNI 库的合并方法。我试图评论所有 jni 代码,但它仍然在发生,所以我认为问题可能出在我的 YUV 方法或 Burst HDR 调用中。

最后是我的日志错误发生时:

01-01 12:30:27.531 21945-21957/com.myCamera W/AudioSystem: AudioFlinger server died!
01-01 12:30:27.532 21945-22038/com.myCamera W/AudioSystem: AudioPolicyService server died!
1-01 12:30:27.903 21945-21978/com.myCamera I/CameraManagerGlobal: Connecting to camera service
01-01 12:30:27.903 21945-21978/com.myCamera E/CameraManagerGlobal: Camera service is unavailable
01-01 12:30:27.903 21945-21978/com.myCamera W/System.err: android.hardware.camera2.CameraAccessException: Camera service is currently unavailable
01-01 12:30:29.103 21945-21945/com.myCamera W/System.err: android.hardware.camera2.CameraAccessException: Process hosting the camera service has died unexpectedly

有时只需要 2 张照片,有时需要 300 张,但最终还是会发生。另外,很多时候我的所有设备都快死了,而且一切正常,所以我需要重新启动手机。

【问题讨论】:

    标签: java android java-native-interface yuv android-camera2


    【解决方案1】:

    最后这个问题是因为我的 ImageReader 配置错误引起的,根据手机的硬件级别,相机可以允许不同类型的 imageReader,每个都有不同的大小。 例如,INFO_SUPPORTED_HARDWARE_LEVEL == FULL 不支持配置为设备最大尺寸的 JPEG 图像阅读器,而另一个具有 YUV 格式的图像阅读器在当时的预览尺寸之上。无论如何,有时它可以工作,有时会失败。

    如果应用程序尝试使用一组超出下表中描述的限制的目标来创建会话,则可能会出现以下三种可能性之一。首先,可以成功创建会话并正常工作。其次,会话可能创建成功,但摄像头设备无法满足 getOutputMinFrameDuration(int, Size) 中所述的帧速率保证。或者第三,如果输出集根本无法使用,会话创建将完全失败,并调用 onConfigureFailed(CameraCaptureSession)。

    引用自:https://developer.android.com/reference/android/hardware/camera2/CameraDevice.html

    这意味着当我的 JPEG imageReader 也配置为相同大小时,我的设备无法将 YUV 图像阅读器配置为 4608x3456 大小。它只能支持我的预览尺寸(1920x1080)。您可以在此link 中检查所有可能的配置。

    【讨论】:

    • 我有非常相似的错误,但原因不同。我花了几个小时试图找到确切的原因......最终我在阅读了一些第一行后找到了它,你开始解释a wrong configuration of my ImageReaders。就我而言,这是关于自定义闪光灯......谢谢你的想法
    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    相关资源
    最近更新 更多