How to set android camera2 preview and capture size?

Refresh

December 2018

Views

6.6k time

5

I am using a SurfaceView to show the preview I capture. I want to use width=1080,height=1920 for the preview. Where can I set the size of the preview?

I googled for an answer, but they are all for camera version one. I am using the android.hardware.camera2.

private void takePreview() {
    try {
        final CaptureRequest.Builder previewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        previewRequestBuilder.addTarget(mSurfaceHolder.getSurface());
        mCameraDevice.createCaptureSession(Arrays.asList(mSurfaceHolder.getSurface(), mImageReader.getSurface()), new CameraCaptureSession.StateCallback() // ③
        {
            @Override
            public void onConfigured(CameraCaptureSession cameraCaptureSession) {
                if (null == mCameraDevice) return;
                mCameraCaptureSession = cameraCaptureSession;
                try {
                    previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                    previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
                    previewRequestBuilder.set(CaptureRequest.JPEG_THUMBNAIL_SIZE, new Size(1080,1920));

                    CaptureRequest previewRequest = previewRequestBuilder.build();
                    mCameraCaptureSession.setRepeatingRequest(previewRequest, null, childHandler);
                } catch (CameraAccessException e) {
                    Log.e("takePreview","onConfigured(CameraCaptureSession cameraCaptureSession)",e);
                }
            }
            @Override
            public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
                Log.e("takePreview","onConfigureFailed");
            }
        }, childHandler);
    } catch (CameraAccessException e) {
        Log.e("takePreview","CameraAccessException");
    }
}

2 answers

1

Посмотрите на пример Camera2Basic , что Google предоставляет на GitHub: https://github.com/googlesamples/android-Camera2Basic

Существует способ, в основном фрагменте, который выбирает дополнительный размер предварительного просмотра для данного устройства. Это может быть лучшим подходом, если вы хотите, чтобы сделать ваше приложение более гибким, а не жестко прописывать размер, но даже если вы по-прежнему достаточно придерживаться заданных размеров вы можете увидеть, как они используют результаты.

Резюме в том, что вы просто установить размер самого, в их случае, TextureView на любой размер предварительного просмотра вы хотите.

Имя метода «chooseOptimalSize» и включает в себя этот комментарий / объяснение:

/**
     * Given {@code choices} of {@code Size}s supported by a camera, choose the smallest one that
     * is at least as large as the respective texture view size, and that is at most as large as the
     * respective max size, and whose aspect ratio matches with the specified value. If such size
     * doesn't exist, choose the largest one that is at most as large as the respective max size,
     * and whose aspect ratio matches with the specified value.
     *
     * @param choices           The list of sizes that the camera supports for the intended output
     *                          class
     * @param textureViewWidth  The width of the texture view relative to sensor coordinate
     * @param textureViewHeight The height of the texture view relative to sensor coordinate
     * @param maxWidth          The maximum width that can be chosen
     * @param maxHeight         The maximum height that can be chosen
     * @param aspectRatio       The aspect ratio
     * @return The optimal {@code Size}, or an arbitrary one if none were big enough
     */
4

Как указано в ссылке на createCaptureSession :

Для нанесения на SurfaceView: После того, как поверхности в SurfaceView в создании, установить размер поверхности с setFixedSize (междунар, Int) , чтобы быть один из размеров возвращаемых getOutputSizes (SurfaceHolder.class ) , а затем получить поверхность с помощью вызова getSurface () , Если размер не установлен приложением, оно будет округлено до ближайшего поддерживаемого размера меньше , чем 1080p, с помощью камеры устройства.