如何在 Android 上与 Google VR 一起使用 UVC 功能Jiandongguo 的模块?

问题描述

这个问题可能听起来含糊不清,但请耐心等待,因为我将提供有关我所面临情况的所有必需详细信息。请记住,我是 Java 和 Android Studio 工作流程的初学者(我一生中大部分时间都使用 C++ 编写桌面程序,最近才需要 Java 来编写移动应用程序)。过去几个月我一直在努力编写一个应用程序,该应用程序通过智能手机的 USB C 端口获取视频输入(它使用一种非常便宜的 USB-HDMI 捕获芯片,Elgato Cam Link 克隆)并将视频输入直接投射到无论用户头部的方向如何,VR 中都位于用户的前方,因此不需要头部跟踪。

Image of the HDMI capture device that plugs into the USB C port of the smartphone

我试图通过合并两个已经可用的代码段来编写这个应用程序:

  1. 可在此处找到的 Google VR 演示 (hellovr) (https://github.com/googlevr/gvr-android-sdk/releases/tag/v1.200),即用户坐在房间里点击的演示 浮动多面体。
  2. 可以在这里找到江东国的UVC模块 (https://github.com/jiangdongguo/AndroidUSBCamera)。我已经选择 他的作品似乎是最多才多艺、写得最好的作品 可用(如果我错了,请纠正我)。

到目前为止我所做的是:

  1. 非常粗略地操纵了“hellovr”代码以满足我的需要- 而不是显示带有浮动多面体的房间和 播放音乐,它现在只渲染虚拟表面 应该投影来自 USB 的视频馈送。目前,只要 证明我对代码所做的更改确实有效 正如预期的那样,这个表面只显示一个闪烁的占位符 让用户知道没有视频源的图形 可用(此图形上的消息显示在我的本机 语言,罗马尼亚语,忽略它)。所以,现在我可以得到任何位图和 通过将其加载到 OpenGL 中,使其覆盖大部分用户的 FOV 纹理,然后将其放置在正在渲染的表面上 就在用户面前。已经完成了一半的工作!这 另一半是将该 OpenGL 纹理链接到 UVC 流。目前 正如我所读到的,有两种方法可以解决这个问题:

    • 更容易实现但效率较低的方法 使用

      预览 UVC 提要的位图

      CameraviewInterface.captureStillImage(width,height);

      对于每个渲染的帧并加载它 进入纹理(一个简单的 TEXTURE_2D),这使用普通的 2D 纹理 片段着色器内的采样器。这种方法是目前 在我迄今为止工作的代码中使用,我将在 这篇文章到此结束。

    • 更难实现,但最有效的方法是使用 GL_TEXTURE_EXTERNAL_OES。据我所知这是一种特殊的 仅当相机的 SurfaceTexture 附加到时才有效的纹理 此纹理的数字 GL 句柄,理论上这将通过 调用

      SurfaceTexture.detachFromGLContext(); SurfaceTexture.attachToGLContext(texGLHandle);

      此外,为了让这个工作,我读到一个特殊的 ExternalOES 采样器必须与纹理一起使用。 在整个“HellovrActivity.java”文件中,您可能会发现我尝试使用此方法完成的工作的一些剩余部分。我所有的尝试都以失败告终。

  2. 在之前修改过的里面插入了江东国的一些代码 谷歌虚拟现实演示。我最确定他们的代码初始化 正确并且能够连接到我的 USB 设备。他们的代码需要 我的应用程序实现了一个特殊的视图,该视图旨在作为 UVC 提要的预览,我向应用程序提供了此视图,但我隐藏了 它位于应该是全屏的主 VR 视图后面。

这是我在测试各种方法时发现的一个有趣方面:

即使我在 ADB 运行时日志中没有显示任何错误的情况下开始工作,以下情况总是会发生:UVC 预览视图开始显示视频源的确切时刻,Google VR 视图变为黑色(白色除外)用于将智能手机的显示屏居中放置在 VR 耳机中的指示器);在我断开 USB 设备的那一刻,UVC 预览视图恢复为非活动状态(如预期),Google VR 视图恢复其正常功能这看起来很奇怪,就好像两个视图无论如何都无法同时工作。

这是我使用过的最后一次尝试 (https://drive.google.com/file/d/1ZzqTtduoVEwLccuF8jzDYVqRCyPWX1BG/view?usp=sharing),它实现了位图方法,我在我的 HUAWEI ELE-L29(又名 HUAWEI P30)上运行了它,但无济于事。我将不胜感激任何帮助找到一种方法来让这个工作。另外,请原谅我凌乱的代码。我提供的链接一个存档,其中包含我一直在从事的整个项目。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...