Подтвердить что ты не робот

Эквивалент Camera.PreviewCallback в API Camera2

Есть ли эквивалент для Camera.PreviewCallback в Camera2 из API 21, лучше, чем сопоставление с SurfaceTexture и вытягивание растрового изображения? Мне нужно убрать данные предварительного просмотра с камеры как YUV?

4b9b3361

Ответ 1

Вы можете начать с примера кода Camera2Basic из Google.

Вам нужно добавить поверхность ImageReader в качестве цели для запроса предварительного просмотра:

//set up a CaptureRequest.Builder with the output Surface
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(surface);
mPreviewRequestBuilder.addTarget(mImageReader.getSurface());

После этого вы можете получить изображение в ImageReader.OnImageAvailableListener:

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
    @Override
    public void onImageAvailable(ImageReader reader) {
        Image image = null;
        try {
            image = reader.acquireLatestImage();
            if (image != null) {
                ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                Bitmap bitmap = fromByteBuffer(buffer);
                image.close();
            }
        } catch (Exception e) {
            Log.w(LOG_TAG, e.getMessage());
        }
    }
};

Чтобы получить Bitmap из ByteBuffer:

Bitmap fromByteBuffer(ByteBuffer buffer) {
    byte[] bytes = new byte[buffer.capacity()];
    buffer.get(bytes, 0, bytes.length);
    return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}

Ответ 2

Да, используйте класс ImageReader.

Создайте ImageReader, используя формат ImageFormat.YUV_420_888 и нужный размер (убедитесь, что вы выбрали размер, поддерживаемый используемым устройством камеры).

Затем используйте ImageReader.getSurface() для Поверхности, чтобы предоставить CameraDevice.createCaptureSession() вместе с вашими другими выходами предварительного просмотра, если они есть.

Наконец, в вашем запросе повторного захвата добавьте предоставленную поверхность ImageReader в качестве цели, прежде чем устанавливать ее как повторяющийся запрос в сеансе захвата.