如何使用Google Cardboard SDK for Unity创建VR视频播放器

8
我刚下载了Unity的Google Cardboard SDK,我可以很好地创建VR项目,安装也没问题,一切正常。虽然我是一个VR应用的菜鸟,但我已经接触了VR应用。我计划为Android开发自己的VR视频播放器,就像默认的Google Cardboard YouTube播放器一样。有人可以向我推荐一个链接或指导我开发这个应用吗?

各位,我正在尝试从Unity资产商店购买EasyMoviePlayer插件@https://www.assetstore.unity3d.com/en/#!/content/10032。有人能建议这是否可以吗? - Rao
5个回答

11

Scott Driscoll的答案完全有效。我最初在让Easy Movie Texture Unity插件为我工作时遇到了一些问题,但最终找到了解决办法,并且它可以完美运行。现在我在我的iPhone 6上拥有360度视频在球体内部作为纹理运行。我必须说,我没想到这会发生。

对于在Mac上工作的情况,这是我所做的:

  1. 从Unity Asset Store下载Easy Movie Texture插件
  2. 打开Assets / EasyMovieTexture / Scene中的Demo Sphere演示场景
  3. 为您的项目创建新的(空白)Prefab,然后将Demo Sphere场景中的Sphere GameObject拖放到Prefab上。
  4. 重新打开您的Cardboard场景并将新的videosphere prefab拖入层次结构中。
  5. 在Quicktime中打开您的源360度视频
  6. 文件->导出->720p
  7. 将文件扩展名从“.mov”更改为“.mp4”
  8. 将您的新mp4文件拖放到项目的Assets / Streaming Assets目录中。注意:不要通过菜单系统导入,因为这将强制Unity转换为OGG。
  9. 在您的videosphere GameObject的“Media Player Ctrl”脚本组件上,找到“Str_File_Name”字段并提供完整的文件名。确保将扩展名作为字符串的一部分包括在内,“mymovie.mp4”。

非常确定这就是全部内容。希望它对其他卡在这个问题上的人有所帮助。谢谢Scott Driscoll!

最后注意一点,您只能在手机上查看视频,而不能在编辑器中预览。如果不工作,这将更好,但实际上,一旦解决了分辨率和位置等初始问题,我并不需要每次在编辑器中运行场景时都看到视频。


如何使用Intent动态传递数据? - suhas_sm

8

这看起来很有前途,但是Easy Movie Texture的文档非常不清晰,而且只针对Android。我该如何将视频实际附加到球体上? 对于Oculus,我只需将其作为纹理附加,但在这里,看起来我需要以某种方式使用Video Manager预制件? - Shannon Perkins
我在视频球演示场景中从视频球制作了一个预制件。视频被引用为视频球的Media Player Ctrl脚本的str_file_name字段上的字符串。该视频需要是Streaming Assets目录中的mp4文件(而不是OGG)。但是,当我使用自己的视频运行应用程序时,仍然只看到一个白色的球体。一旦我切换回示例视频,就没问题了。我认为问题出在我的视频尺寸上,它是360度视频,而不是示例视频所示的矩形视频。我正在尝试运行的360度视频尺寸为3906 x 1952。有什么想法吗? - Shannon Perkins

3
我看到上面的答案,但它们要么需要Easy Movie Texture Unity插件,要么需要编写代码... 还有一个简单的解决方案,无需购买该资产或通过编码解决问题... Oculus提供了一个已构建好的免费示例框架,您可以轻松使用它... 下面的解决方案展示了如何为Unity创建照片查看器和视频查看器。
构建您的360度照片查看器:
  1. 进入Blender并删除所有现有对象(如果有),制作一个20面体,并将细分增加到6,以便它更像一个球体,然后点击“生成UV”(这两个选项都在添加到球形下的设置中)并转到编辑模式,并选择翻转法线,以便您可以从内部看到而不是从外部向内看,并保存它。
  2. 将该保存的20面体文件带入Unity中的资源文件夹。
  3. 下载GoogleVR SDK并将GoogleVR插件也放到资源文件夹中。(您可以在此处下载:https://developers.google.com/vr/unity/)
  4. 删除默认情况下存在的主摄像机和定向光。
  5. 将您的20面体资产带入您的项目中。
  6. 从您的资源文件夹中将GVR Main带入您的项目中:GoogleVR插件 -> Legacy -> Prefab ->GVR Main
  7. 在您的资源文件夹中取任何全景或360照片。
  8. 将此照片放在场景中20面体的上方并播放。 您应该能够看到您的360度照片。
构建您的360度电影播放器:
  1. 第1步不变。
  2. 现在进入Oculus开发者控制台,下载此文件并将其放入您的资源文件夹中。 https://developer3.oculus.com/downloads/game-engines/1.5.0/Oculus_Sample_Framework_for_Unity_5_Project/
  3. 将您下载的文件放入资源文件夹中。
  4. 在您的资源文件夹中找到MoviePlayer并将其带入项目中。
  5. 将您下载的icosphere也放入资源文件夹中,并将其稍微缩小一点,以便您可以正确地看到它。
  6. 复制MoviePlayer示例脚本和电源声音,在项目中从MovieSurface组件中添加到场景中的球体组件中,还要从球体组件中删除动画师。
  7. 在MovieSurface的Materials下找到Movie Player材质,并将其添加在您的球体上面。
  8. 现在形成的这个球体就是您的360度电影播放器,所以将其存储为资源文件夹中的资产。
  9. 创建一个新场景,删除平行光,并将你保存的icosphere资产带入该场景中,并将主相机移动到中心位置。
  10. 除了MoviePlayer、插件和流式资产之外,删除不需要的资产,以清理一些项目空间。
  11. 你还需要将所需的mp4转换为ogv文件,以便插件能够在VR中播放,并将这两个文件都放入流媒体资产文件夹中,更改MovieName并单击播放。您应该能够看到您的360度视频正在播放。

*要在设备上播放它,请转到构建设置并选择所需的平台,删除所有场景,只添加Open Scene并在Player Settings下的Other Settings中启用Virtual Reality Supported。 要在Android手机上播放它,您需要下载GoogleVR SDK,就像上面那样,将其带入您的资源文件夹中,并在资源文件夹中查找GVRViewerMain,并将其带入场景中,并取消您之前启用的Virtual Reality Supported,然后在设备上构建和运行整个东西(当您在Unity中点击Play时,您应该能够在游戏模式中看到视图)。 您应该能够在相应的设备上看到视频。

  • 也有一个视频教程可用,但是我只能分享两个链接给我的新StackOverFlow个人资料。

请问您能否在评论中分享视频链接?因为我是Unity的新手,所以有些步骤不太明白。谢谢。 - Muhammad Hamza Shahid

1
这对于Unity 5.6及以上版本变得非常简单。
  1. 您只需要一个球体,其法线翻转,您可以在网上找到或者使用Blender制作IcoSphere并翻转其法线,或者使用着色器在普通球体上进行相同的操作。无论哪种情况,都要为着色器使用未照明纹理。
  2. 在组件中添加默认与Unity一起提供的Video Player到这个球体上。
  3. 将任何360度视频添加到此Video Player中。您也可以添加在线链接。它在从GoogleVR到SteamVR的平台范围内始终稳定播放。

唯一的缺点是,默认情况下仅播放单眼图像/视频,并且需要进行一些调整才能运行立体图像/视频。


1

我无法帮助你解决Unity相关问题,但在Java中,你可以使用OpenGL-ES创建纹理:

private static int GL_TEXTURE_EXTERNAL_OES = 0x8D65;
....
GLES20.glGenTextures(1, textureHandle, 0);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureHandle[0]);

使用它来创建表面纹理和表面:
SurfaceTexture surfaceTexture = new SurfaceTexture(textureHandle[0]);
Surface surface = new Surface(surfaceTexture);

然后将该表面传递给android.media.MediaPlayer:

MediaPlayer mediaPlayer = new MediaPlayer(getContext(), uriToMyMediaFile, surface);

将该纹理绑定到场景中的一个正方形上,每帧调用此函数:
surfaceTexture.updateTexImage()

当您调用mediaPlayer.start()时,视频将开始播放。

如果Unity允许您编写自己的Java代码来在后台运行,那么如果您将该纹理绑定到从Unity传递过来的surface上,这应该可以实现。

如果您有一个无法使用mediaPlayer播放的视频流(如实时视频聊天等),您也可以使用android.media.MediaCodec与surface一起使用,但需要进行更多的设置工作。


谢谢Mog,我们可以在Unity中使用C#,Java和Boo编写代码。如果您的建议适用于我,我会检查并告诉您我的结果。 - Rao
@Mog,我按照你的步骤尝试了一下,但是我的应用程序总是显示黑屏,我不知道哪里出错了 :(,你有这方面的示例吗?非常感谢~ - sunjinbo
我的一些代码在这里:https://www.evernote.com/shard/s211/sh/ecb4fb7a-7ca7-49ea-aa5f-52bc75ffd4d8/cd3c423d82fb905c - sunjinbo
如果你下载了GearVR的Oculus Mobile SDK,里面有一个CinemaSDK的示例,可以在虚拟屏幕上播放手机上的电影。你需要Note 4或S6来运行它,但你可以查看代码并了解他们在做什么:https://developer.oculus.com/downloads/#version=mobile-0.6.0 - Mog
嗨Mog,你有基于下面代码的示例代码片段吗?我从CardBoard谷歌网站下载了示例项目,但不知道如何更改代码以添加Surface View。谢谢。 - Qing
有人成功了吗?我按照这些步骤进行了操作,但是出现了“ERROR: java.lang.IllegalStateException: Unable to update texture contents (see logcat for details)”的错误提示。我将纹理ID从Unity的Texture.GetNativeTexturePtr()传递到SurfaceTexture构造函数中。我是否不应该在每个中使用相同的纹理ID? - sapanda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接