2

これは、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 に問題はありません。

4

2 に答える 2

1

API 23 にアップグレードしたところ、同じコードが正常に機能しました。API 22でもテストされ、機能しました。

と同じ : ImageReader で Camera2 API を使用する

于 2016-07-12T14:52:08.333 に答える
0

あなたの観察は正しいです。API 21 は Camera2 を適切にサポートしていません。これは、ここSOで何人かの人々によって独立して発見されました。

そのため、API22 よりも前に Camera2 を使い始めるのが合理的です。それまでの間、ドキュメントが修正されなかった理由は理解できません。

個人的に Camera2 の研究を続けていますが、今でも自分のアプリで Camera2 を使用することに消極的です。最初に多くのデバイスでテストしたいと思います。近い将来、「Camera1」が新しいデバイスでサポートされなくなることはないと思います。

于 2016-07-13T07:46:44.070 に答える