Android Camera2,我从ImageReader获取YUV图像。 U和V缓冲区只有一行(跨步)数据,其余为零

时间:2016-07-12 09:52:13

标签: android yuv camera2

这是我实例化ImageReader的方法。

Size[] sizes = configs.getOutputSizes(ImageFormat.YUV_420_888);
        mImageReader = ImageReader.newInstance(width, height, ImageFormat.YUV_420_888, 2);

        mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, null);

        Surface rgbCaptureSurface = mImageReader.getSurface();
        List<Surface> surfaces = new ArrayList<Surface>();
        surfaces.add(rgbCaptureSurface);

        //surfaces.add(surface);

        mPreviewRequestBuilder
                = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        //mPreviewRequestBuilder.addTarget(surface);

        mPreviewRequestBuilder.addTarget(rgbCaptureSurface);

        mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {


            @Override
            public void onConfigured(CameraCaptureSession cameraCaptureSession) {
                // The camera is already closed
                if (null == mCameraDevice) {
                    return;
                }

                // When the session is ready, we start displaying the preview.
                mCaptureSession = cameraCaptureSession;
                try {
                    // Auto focus should be continuous for camera preview.
                    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                            CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO);

                    // Flash is automatically enabled when necessary.
                    //setAutoFlash(mPreviewRequestBuilder);

                    // Finally, we start displaying the camera preview.
                    mPreviewRequest = mPreviewRequestBuilder.build();
                    mCaptureSession.setRepeatingRequest(mPreviewRequest,
                            mCaptureCallback, null);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
            }

阅读是这样完成的:

  public void onImageAvailable(ImageReader reader) {
        Image image;
        while (true) {
            image = reader.acquireLatestImage();

            if (image == null) return;


            Image.Plane Y = image.getPlanes()[0];
            Image.Plane U = image.getPlanes()[1];
            Image.Plane V = image.getPlanes()[2];

            int Yb = Y.getBuffer().remaining();
            int Ub = U.getBuffer().remaining();
            int Vb = V.getBuffer().remaining();

            byte[] data = new byte[Yb + Ub + Vb];


            Y.getBuffer().get(data, 0, Yb);
            U.getBuffer().get(data, Yb, Ub);
            V.getBuffer().get(data, Yb + Ub, Vb);

我尝试了几种不同的ImageFormats。我在LG G3,API 21上进行了测试,问题出现了。在Nexus 4上我没有问题,API 22。

2 个答案:

答案 0 :(得分:1)

我升级到API 23并且相同的代码工作正常。也在API 22上进行了测试,它也有效。

Using Camera2 API with ImageReader

相同

答案 1 :(得分:0)

你的观察是正确的。 API 21不能正确支持Camera2。几个人在这里独立地发现了这一点,参见例如Camera2 API21 not working

因此,在API22之前开始使用Camera2是合理的。在此期间,为什么文档没有被修改,这是不可理解的。

就我个人而言,我正在继续进行Camera2研究,但我仍然不愿意在我的应用程序中使用Camera2。我首先要在许多设备上进行测试,并且在不久的将来我不会期望&#34; Camera1&#34;新设备不再支持。