使用外部视频流替换Wikitude ArchitectView中的摄像机流

时间:2017-01-25 16:38:54

标签: android opengl-es textureview wikitude dji-sdk

我正在研发面向无人机摄像机视图的实时增强可视化的Android移动应用程序(特别是我正在使用相对SDK的DJI Phantom 3 Professional)。我正在使用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由摄像机流的渲染和渲染的渲染组成,如下图所示: Architect View Composition

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>

有没有办法用我的 TextureView 的内容替换Wikitude Architect View的当前相机流?

或者,是否有办法将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"/>

2 个答案:

答案 0 :(得分:1)

您可以结合Wikitude Input Plugin实施自己的dji's Video Stream Decoding。因此,您从dji sdk获取原始视频数据并将其传递给wikitude sdk。可以在wikitude示例应用程序中找到输入插件的示例代码,样本名称为“自定义相机”。

答案 1 :(得分:0)

亚历克斯回答是正确的,它的确有效。以下是一些更多细节: Wikitude输入插件可用于提供您自己的相机输入,您也可以应用自己的扩充和自己的渲染。请参阅Wikitude输入插件文档。

根据Wikitude示例,Custom Camera Plugin可用作起点。您开发自己的Camera Extension,并在构造函数中执行以下操作:

    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摄像机视图添加到Architect视图中。

然后我实现了传入帧的回调。

// 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,&#34; make byte array&#34;);                     byte [] b = getNV21(0,0,bmpRotate.getWidth(),bmpRotate.getHeight(),bmpRotate);

//并将框架传递给插件以进行进一步处理                     notifyNewCameraFrameN21(B);

                gotFrame = false;
            }
        });

    }
}

希望这会有所帮助。快乐的编码! 菲尔