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

Posted

技术标签:

【中文标题】如何使用 Google Cardboard SDK for Unity 创建 VR 视频播放器【英文标题】:How to create VR Video player using Google Cardboard SDK for Unity 【发布时间】:2015-05-16 16:10:12 【问题描述】:

我刚刚下载了 Google Cardboard SDK 以实现统一。我很好,能够创建 VR 项目。设置很好,一切正常。

我是 VR 应用程序的菜鸟。刚刚进入 VR 应用程序。

我正计划为 android 创建自己的支持 VR 的视频播放器,就像默认的 Google Cardboard Youtube 播放器一样。

谁能给我一个链接或指导我开发这个应用程序。

【问题讨论】:

@All,我正在尝试从 Unity 资产商店购买 EasyMoviePlayer 插件@assetstore.unity3d.com/en/#!/content/10032。任何人都可以建议这是否可以。 【参考方案1】:

Scott Driscoll 的回答完全有效。我在让 Easy Movie Texture Unity 插件为我工作时遇到了一些问题,但最终解决了这个问题,并且它完美无缺地工作。现在,我在 iPhone 6 上的球体内部以纹理的形式运行了 360 度视频。我不得不说,我认为这不会发生。

为了在 Mac 上工作,我是这样做的:

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

很确定这就是一切。希望它可以帮助其他人解决这个问题。谢谢斯科特·德里斯科尔!

最后一点,您只能在手机上观看视频,而不能在编辑器中预览。如果它不以这种方式工作会更好,但实际上一旦解决了最初的分辨率和位置问题,我真的不需要每次在编辑器中运行场景时都查看视频。

【讨论】:

如何使用intent动态传递数据?【参考方案2】:

以下是我们如何做到这一点的主要步骤:

    添加一个球体,该球体具有 equirectangular UV 映射和相机周围的内向法线。 购买插件以在该球体的纹理上播放电影。我推荐Easy Movie Texture。 使用与平台兼容的 mp4s 或 ogg vorbis 文件。这取决于手机和操作系统。

详细信息:http://immersivetechblog.foundry45.com/2015/07/31/implementing-360-video-in-unity-for-gear-vr-and-cardboard/

【讨论】:

这看起来很有希望,但是 Easy Movie Texture 的文档非常不清楚并且是特定于 Android 的。我如何实际将视频附加到球体?对于 Oculus,我只是将其附加为纹理,但在这里看起来我以某种方式使用了视频管理器预制件? 我在视频球演示场景中从视频球制作了一个预制件。视频在视频领域的媒体播放器 Ctrl 脚本的 str_file_name 字段中被引用为字符串。视频需要是 Streaming Assets 目录中的 mp4 文件(不是 OGG)。但是,当我使用自己的视频运行应用程序时,我仍然只看到一个白色球体。一旦我切换回示例视频,我就没事了。我认为问题在于我的视频的尺寸,它是 360 度视频,而不是示例视频那样的直线视频。我尝试运行的 360 度视频是 3906 x 1952。有什么想法吗?【参考方案3】:

我看到了上面的答案,但所有这些都需要 Easy Movie Texture Unity 插件或编写自己的方式。 还有另一个简单的解决方案,它不需要您购买该资产或编写代码。 Oculus 提供了一个已经构建好的免费示例框架,您可以轻松使用它。 下面的解决方案展示了如何为 Unity 创建照片查看器和视频查看器。

构建您的 360 度 PhotoViewer:

    转到 Blender 并删除所有预先存在的对象(如果有)并制作一个 icosphere 并将细分增加到看起来更像一个球体的点,如 6,然后点击 Generate UVs(这两个选项都可以在下面的设置中找到在添加到球体中创建选项卡)并转到编辑并选择翻转法线,以便您可以看到由内向外而不是从外向内并保存。 将 icosphere 保存的文件放入 Unity 中的资产文件夹中。 下载 GoogleVR SDK 并将 GoogleVR 插件也带入您的资产文件夹中。(您可以在此处下载:https://developers.google.com/vr/unity/) 删除默认存在的主摄像头和定向光。 将您的 icosphere 资产带入您的项目。 将 GVR Main 从您的资产文件夹引入您的项目:GoogleVR 插件 -> Legacy -> Prefab -> GVR Main 拍摄任何全景或 360 度全景照片并将其放入您的资产文件夹。 在您的资产文件夹中拍摄这张照片,并将其放在场景中的 icosphere 上方,然后点击播放。您应该能够看到您的 360 度全景照片。

构建您的 360 度 MoviePlayer:

    步骤 1 相同。 现在转到 Oculus 开发者控制台并下载此文件并将其带到您的资产文件夹中。 https://developer3.oculus.com/downloads/game-engines/1.5.0/Oculus_Sample_Framework_for_Unity_5_Project/ 将您在上面下载的这个文件带到您的资产文件夹中。 在您的 assetsFolder 中找到 MoviePlayer,将其带入您的项目。 将您下载的 icosphere 也带入您的资产文件夹并稍微缩放,以便您可以正确查看。 从项目中复制MovieSurface组件中的MoviePlayer示例脚本和Audio Source,添加到场景中的球体组件中,同时去掉球体组件中的animator。 在 MovieSurface 的 Mesh Renderer 下的 Materials 中找到 Movie Player 材质,并将其添加到您的球体顶部。 现在形成的这个球体就是您的 360 度电影播放器​​,因此请将其作为资产存储在资产文件夹中。 创建一个新场景,删除定向光并将您保存的 icosphere 资产带入该场景,然后将主摄像头移至中心。 删除不需要的资源以清理项目中的某些空间,而不是 MoviePlayer、插件和流媒体资源。 您还必须将所需的 mp4 转换为 ogv 文件,插件才能在 VR 中播放,并将 mp4 和 ogv 文件放入您的流媒体资源文件夹并更改 MovieName 并单击“播放”。您应该能够看到您的 360 度视频正在播放。

*要在您的设备中播放它,只需转到构建设置并选择所需的平台并删除所有场景,然后添加打开场景并单击播放器设置下的其他设置中支持的虚拟现实。 要在你的 android 手机上播放它,你需要像上面一样下载 GoogleVR SDK 并将它带到你的 assets 文件夹中,然后在 assets 文件夹中找到 GVRViewerMain 并将其带入场景并取消选中你上面所做的 Virtual Reality Supported 并构建并在您的设备中运行整个程序(当您在 Unity 中点击播放时,您应该能够在游戏模式中看到视图)。 您应该能够在各自的装备上观看视频。

还有一个视频教程可用,但我只能与我的新 *** 个人资料分享 2 个链接。

【讨论】:

您能否在评论中分享视频链接...由于我是 Unity 新手,所以很难按照您的步骤操作...谢谢【参考方案4】:

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 的表面,这应该可以工作。

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

【讨论】:

Thax Mog,在 Unity 中,我们可以用 C#、Java 和 boo 编写代码。如果您建议对我有用,我会检查并告诉您我的结果。 @Mog,我按照你的步骤试了一下,但是我的应用程序总是显示黑屏,我不知道我在哪里做错了:(,你有这个示例吗? 非常感谢~ 我的一些代码在这里:evernote.com/shard/s211/sh/ecb4fb7a-7ca7-49ea-aa5f-52bc75ffd4d8/… 如果您下载适用于 GearVR 的 Oculus Mobile SDK,其中的 CinemaSDK 示例会在虚拟屏幕上播放来自手机的电影。您需要 Note 4 或 S6 才能运行它,但您可以查看代码并了解它们在做什么:developer.oculus.com/downloads/#version=mobile-0.6.0 嗨,Mog,您有基于以下代码的示例代码 sn-p 吗?我从 CardBoard 谷歌网站下载了示例项目,但不知道如何更改代码以添加表面视图。谢谢【参考方案5】:

这对于 Unity 5.6 及更高版本变得非常简单。

    您只需要一个法线反转的球体,您可以在网上找到该球体,或者只需转到搅拌机并制作 IcoSphere 并翻转其法线,或者您可以使用着色器在法线球体上执行相同操作。无论哪种情况,都为着色器使用 Unlit 纹理。 在Unity默认的组件中添加一个视频播放器到这个球体。 将任何 360 度视频添加到此视频播放器。您也可以添加在线链接。它在从 GoogleVR 到 SteamVR 的各种平台上始终表现出色。

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

【讨论】:

以上是关于如何使用 Google Cardboard SDK for Unity 创建 VR 视频播放器的主要内容,如果未能解决你的问题,请参考以下文章

_SecTrustEvaluate 与 Google Cardboard Unity3d SDK 的链接错误

Sphere 未在 Unity 中为 Google Cardboard 渲染

Google Cardboard - Cardboard VR 套件是不是有 iPhone / iOS 入门项目?

iOS 14 Google Cardboard 视图已损坏

错误膨胀类 com.google.vrtoolkit.cardboard.CardboardView 崩溃应用程序

如何为 Google Cardboard 配置 React 360