Замените поток камеры в Wikitude ArchitectView внешним видеопотоком.

Я работаю над мобильным приложением для Android, ориентированным на расширенную визуализацию обзора камеры дрона в режиме реального времени (в частности, я работаю над DJI Phantom 3 Professional с соответствующим SDK). Я использую платформу Wikitude для части AR. Каждый образец Wikitude работает, увеличивая обзор камеры смартфона, поэтому мне нужно перенаправить входной видеопоток. На данном этапе, используя возможности DJI SDK, у меня есть объект TextureView, содержащий корректно декодированный поток, исходящий от дрона. Ниже приведены относительные инструкции в верхней части XML-файла текущего представления:

<TextureView
    android:id="@+id/video_previewer_surface"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:layout_centerHorizontal="true"
    android:layout_above="@+id/linearLayout" />

На самом деле Wikitude Architect View состоит из рендеринга потока камеры и рендеринга дополнений, как показано на следующем рисунке: Композиция архитектурного представления

файл sample_cam.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal">

   <com.wikitude.architect.ArchitectView
      android:id="@+id/architectView"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"/>
</LinearLayout>

Есть ли способ заменить текущий поток камеры Wikitude Architect View содержимым моего TextureView?

В качестве альтернативы, есть ли способ сделать поток камеры ArchitectView прозрачным фоном, чтобы этот слой перекрывался с TextureView?

Следующее может быть частью кода окончательного XML-файла:

<TextureView
    android:id="@+id/video_previewer_surface"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:layout_centerHorizontal="true"
    android:layout_above="@+id/linearLayout" />
<com.wikitude.architect.ArchitectView  // with transparent background for camera
   android:id="@+id/architectView"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"/>

person giannisergente    schedule 25.01.2017    source источник
comment
Проблема, о которой вы упомянули, похоже, связана с плагином ввода. Попробуйте передать данные кадра в формате YV12 вместо NV21.   -  person Someone    schedule 10.02.2017


Ответы (2)


Вы можете реализовать свой собственный модуль ввода Wikitude. в сочетании с декодированием видеопотока dji. Таким образом, вы получаете необработанные видеоданные из dji sdk и передаете их в wikitude sdk. Образец кода для входного плагина можно найти в образце приложения Wikitude под названием «Пользовательская камера».

person Someone    schedule 26.01.2017

Ответ Алекс правильный, и он работает. Вот еще некоторые подробности: Плагин Wikitude Input может использоваться для ввода вашей собственной камеры, а также вы можете применять свои собственные дополнения и свой собственный рендеринг. См. документацию по плагину ввода Wikitude.

Судя по образцам Wikitude, в качестве отправной точки можно использовать плагин Custom Camera. Вы разрабатываете собственное расширение камеры и в конструкторе делаете что-то вроде этого:

    arVideoView = new SurfaceViewRenderer(activity);
    arVideoView.setId(R.id.local_surface_rendeer);
    LinearLayout.LayoutParams param1 = new LinearLayout.LayoutParams(
            FrameLayout.LayoutParams.MATCH_PARENT,
            FrameLayout.LayoutParams.MATCH_PARENT,
            1.0f
    );
    arVideoView.setLayoutParams(param1);
    arVideoView.setKeepScreenOn(true);
    architectView.addView(arVideoView);

В этом случае я добавил представление камеры WebRTC в представление архитектора.

Затем я реализовал обратный вызов для входящих кадров.

// Implementation detail: bridge the VideoRenderer.Callbacks interface to the
// VideoStreamsView implementation.
public class VideoCallbacks implements VideoRenderer.Callbacks {
    @Override
    public void renderFrame(final VideoRenderer.I420Frame i420Frame) {
        Log.v(TAG, "renderFrame ..."+i420Frame);

.. преобразовать кадры в nv21 Log.v(TAG, "сделать байтовый массив"); byte[] b = getNV21(0,0, bmpRotate.getWidth(), bmpRotate.getHeight(), bmpRotate);

// и передать кадр плагину для дальнейшей обработки notifyNewCameraFrameN21(b);

                gotFrame = false;
            }
        });

    }
}

Надеюсь это поможет. Удачного кодирования! Фил

person user2996950    schedule 11.06.2018