这个问题听起来可能含糊不清,但请稍候,因为我将提供有关我所面临的情况的所有必要细节。请记住,我是java和androidstudio工作流的初学者(我用c++编写桌面程序已经有大半辈子了,只是最近移动应用程序才需要java)。在过去的几个月里,我一直在努力编写一个应用程序,通过智能手机的usb c端口(它使用了一种非常便宜的usb hdmi捕获芯片,elgato cam link克隆)获取视频输入,并在vr中直接在用户面前投射视频,而不管用户头部的方向如何,因此,无需头部追踪。
插入智能手机usb c端口的hdmi捕获设备的图像
我试图通过合并两段已经可用的代码来编写此应用程序:
谷歌虚拟现实演示(hellovr)可以在这里找到(https://github.com/googlevr/gvr-android-sdk/releases/tag/v1.200),即用户坐在房间中单击浮动多面体的演示。
江东国的uvc舱可能在这里找到(https://github.com/jiangdongguo/androidusbcamera). 我选择了他的作品,因为它似乎是最多才多艺和写得很好的一个可用(请纠正我,如果我错了)。
到目前为止,我所做的是:
非常粗略地操作“hellovr”代码以满足我的需要-它不再显示带有浮动多面体的房间和播放音乐,而是现在只渲染虚拟表面,usb的视频馈送应该投影在该表面上。现在,为了证明我对代码所做的修改确实按预期工作,这个界面只显示一个闪烁的占位符图形,让用户知道没有可用的视频源(这个图形上的消息是用我的母语罗马尼亚语显示的,忽略它)。因此,现在我可以得到任何位图,并通过将其加载到opengl纹理中,然后将其放置到正呈现在用户面前的曲面上,使其覆盖用户的大部分视野。一半的工作已经完成了!另一半是将opengl纹理链接到uvc流。据我所知,有两种方法:
更容易实现,但效率较低的方法获得预览位图的uvc饲料与 CameraViewInterface.captureStillImage(width, height);
对于每个渲染帧并将其加载到纹理(简单的纹理2d),这将使用片段着色器中的普通2d纹理采样器。这个方法是目前我在代码中使用的方法,我将在本文的最后链接它。
更难实现,但最有效的方法是使用gl\u纹理。据我所知,这是一种特殊类型的纹理,仅当相机的surfacetexture附加到此纹理的数字gl控制柄时才起作用,理论上可以通过调用: SurfaceTexture.detachFromGLContext(); SurfaceTexture.attachToGLContext(texGLHandle);
另外,为了使这个工作,我读到一个特殊的externaloes采样器必须与纹理一起使用。在整个“hellovractivity.java”文件中,您可能会找到我使用此方法试图完成的部分内容。我所有的尝试都以失败告终。
在之前修改过的谷歌虚拟现实演示中插入了江东国的一些代码。我几乎可以肯定,他们的代码初始化正确,能够连接到我的usb设备。他们的代码需要我的应用程序实现一个特殊的视图,这是作为一个预览的uvc饲料,我提供了这个视图的应用程序,但我隐藏在主虚拟现实的看法,应该是全屏。
在测试各种方法时,我发现了一个有趣的方面:
即使我在adb运行时日志中没有显示错误的情况下也能正常工作,但以下情况总是会发生:当uvc预览视图开始显示视频源时,google vr视图变为黑色(除了用于将智能手机显示屏置于vr耳机中的白色指示灯);当我断开usb设备的连接时,uvc预览视图将恢复为非活动状态(如预期的那样),google vr视图将恢复其正常功能。这看起来很奇怪,好像这两种观点无论如何都不能同时起作用。
这是我最后一次尝试(https://drive.google.com/file/d/1zzqttduovewlccuf8jzdyvqrcypwx1bg/view?usp=sharing),它实现了位图方法,我在我的华为ele-l29(又名华为p30)上运行了它,但没有结果。我将非常感谢任何帮助,找出一个办法,使这项工作。另外,请原谅我的密码太乱。我提供的链接是一个档案,其中包含了整个项目,我一直在工作。
暂无答案!
目前还没有任何答案,快来回答吧!