Camera2: удалить поверхность из уже созданного CameraCaptureSession - PullRequest
1 голос
/ 05 февраля 2020

Я создаю приложение, которое принимает видео с передней и задней камеры одновременно. Обе камеры отправляют изображения на соответствующий ImageReader для некоторой обработки. У меня также есть TextureView, чтобы показать предварительный просмотр с любой камеры, выбранной пользователем.

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

Теперь, когда пользователь переключает камеру , я хочу удалить TextureView Surface из одного CameraCaptureSession и добавить в другой сеанс

Можно ли как-нибудь удалить Surface из CameraCaptureSession, не закрывая сеанс?

Мой код на данный момент (аналогично для камера заднего вида):

        SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
        surfaceTexture.setDefaultBufferSize(mTextureView.getWidth(), mTextureView.getHeight());
        mCaptureRequestBuilderFront = mCameraDeviceFront.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

        List<Surface> surfaces = new ArrayList<Surface>();

        /* Make Surface out of texture as preview is shown on a Surface */
        Surface surface = new Surface(surfaceTexture);
        surfaces.add(surface);
        mCaptureRequestBuilderFront.addTarget(surface);

        /* Make Surface out of ImageReader to get images for processing */
        Surface readerSurface = mImageReaderFront.getSurface();
        surfaces.add(readerSurface);
        mCaptureRequestBuilderFront.addTarget(readerSurface);

        /* Create the Capture Session to start getting images from the camera */
        mCameraDeviceFront.createCaptureSession(
                surfaces
                , mSessionCallbackFront
                , mBackgroundHandler);

1 Ответ

1 голос
/ 06 февраля 2020

Нет, это невозможно. Вы, конечно, можете прекратить нацеливание TextureView в своих запросах, но другой сеанс не может включить TextureView в свой набор выходных данных, если только первый сеанс не воссоздан без него.

Если вы хотите сделать это более плавным, вы ' В основном необходимо реализовать собственную буферизацию маршрутизации - например, иметь этап GL, который имеет две входные SurfaceTextures и визуализирует в TextureView SurfaceTexture, а затем подключает каждую камеру к SurfaceTexture. Затем вы пишете пиксельный шейдер, который просто копирует текстуру поверхности A или B в выходной файл, в зависимости от того, какая камера активна.

Это довольно много, но довольно эффективно.

Вкл. В последних Android выпусках вы можете попробовать использовать пару ImageReader для камеры и ImageWriter для TextureView, используя ImageReader конструктор , который принимает флаг использования, с флагом использования GPU_SAMPLED_IMAGE . Затем поместите изображение в ImageReader, который у вас в данный момент активен, в ImageWriter в TextureView.

...