2016-07-13 1 views
4

며칠 동안 문제를 해결하기 위해 주변을 둘러 보았습니다. 지금 당장은 완전히 두려워하고 있습니다. 모든 것을 시도했는데 왜 내 카메라 앱이 나를 죽은 서비스 예외로 설정하는지 이유를 찾지 못했습니다.카메라 서비스를 호스팅하는 프로세스가 예기치 않게 사망했습니다.

여기에 해당합니다. 저는 이미 확인한 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; 
     } 
을 그래서, 문제는 내 코드에있을해야

/** 
* 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 라이브러리 내 병합 메소드를 호출

여기 내 YUV 방법입니다. 모든 jni 코드를 주석 처리하려고 시도했지만 여전히 발생하고 있습니다. 따라서 문제는 여기, YUV 메소드 또는 버스트 HDR 호출에 있어야합니다. 이 happends 때

마지막으로 여기 내 로그 오류입니다 :

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을했지만 결국, 그것은 여전히 ​​일어나고. 또한 많은 시간 내 모든 장치가 거의 죽었고 어떤 작업이든 상관 없으므로 전화기를 재부팅해야합니다.

나는 누군가가 나를 도울 수 있기를 바란다. 왜냐하면 내가 시도한 모든 것을 완전히 버리고 나는 단지 하하하에서 죽기를 원하기 때문이다.

미리 감사드립니다.

답변

1

마지막으로이 문제는 전화의 하드웨어 수준에 따라 ImageReaders 구성이 잘못되어 카메라가 서로 다른 크기의 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를 너무 동일한 크기 컨피그 때 내 장치는 4608x3456 크기 컨피그 YUV 이미지 판독기를 가질 수 있다는 것을 의미한다. 내 미리보기 크기 (1920x1080) 만 지원할 수 있습니다. 이 link에서 가능한 모든 구성을 확인할 수 있습니다.

나는 해결책을 찾고있는 마지막 날에 정말로 화를 냈다. 이제 이것이 같은 문제를 가진 누군가를 도울 것입니다!

좋은 하루 되세요!

+0

나는 아주 비슷한 오류가 있었지만 그 이유는 틀 렸습니다. 나는 몇 시간 동안 정확한 이유를 찾으려고 노력했다. 그리고 결국 나는 당신이'잘못된 ImageReader 구성 '에 대해 설명하기 시작하는 몇 줄의 첫 번째 줄을 읽은 후에 그것을 발견했다. 제 경우에는 맞춤 플래시 라이트에 관한 것이 었습니다 ... 아이디어에 감사드립니다. –

관련 문제