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



我正在开发一款面向无人机摄像头视图实时增强可视化的Android移动应用程序(特别是我正在开发带有相关SDK的DJI Phantom 3 Professional)。我在AR部分使用Wikitude框架。每个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"/>

您可以结合dji的视频流解码来实现自己的Wikitude输入插件。因此,您可以从dji-sdk获取原始视频数据,并将其传递给wikitude-sdk。输入插件的示例代码可以在wikitude示例应用程序中找到,示例名称为"自定义相机"。

Alex的答案是正确的,并且有效。以下是一些详细信息:Wikitude输入插件可以用于提供您自己的相机输入,您也可以应用自己的增强和渲染。请参阅Wikitude输入插件文档。

根据Wikitude示例,自定义相机插件可以作为一个起点。你开发自己的相机扩展,在构造函数中,你可以做这样的事情:

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);

在这种情况下,我在Architect视图中添加了一个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);

将帧转换为nv21Log.v(TAG,"生成字节数组");byte[]b=getNV21(0,0,bmpRotate.getWidth(),bmpRotte.getHeight(),bmcRotate);

//并将帧传递给插件进行进一步处理通知新相机框架N21(b);

gotFrame = false;
}
});
}
}

希望这能有所帮助。编码快乐!Phil

最新更新