【问题标题】:Google Cardboard video texture on iOS with Unity 5带有 Unity 5 的 iOS 上的 Google Cardboard 视频纹理
【发布时间】:2015-06-02 07:13:57
【问题描述】:

我正在尝试使用 Google Cardboard SDK 制作球形 360 度视频。

我已经使用MovieTexture 进行了一些测试,以获得可以正常运行的桌面版本,但在 iOS 中没有此类的实现。

我在资产商店看到了一些外部插件,但似乎没有一个与 Unity 5 兼容。

Cardboard SDK 是否提供了一个类来实现这一点,或者如果没有,您是否知道其他解决方案或插件可以实现这一点?

【问题讨论】:

  • 我也有兴趣。你找到解决办法了吗?
  • 我一直在调查assetstore.unity3d.com/en/#!/content/2449。视频播放适用于设备和编辑器;但是一旦我集成了 Google Cardboard 相机预制件,它似乎就在设备上失败了。仍在研究这个,我一定在某个地方犯了错误。如果你也取得了一些进展,请随时告诉我:)
  • 我遇到了同样的问题,你能解决它吗?

标签: ios unity3d google-cardboard


【解决方案1】:

Unity 中的电影通常被渲染为对象上的纹理。在移动设备上,问题变成设备只想在视频播放器中显示视频,因此不支持 Unity 类 MovieTexture。

我成功地绕过了这个问题,并使用 Unity Asset Store 中名为 Easy Movie Texture 的 Unity 插件成功地在球体内部渲染了 360 度视频。

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

  1. 从 Unity Asset Store 下载 Easy Movie Texture 插件
  2. 从 Assets/EasyMovieTexture/Scene 打开 Demo Sphere 演示场景
  3. 为您的项目创建一个新的(空)Prefab,并将 Sphere GameObject 从 Demo Sphere 场景拖到 Prefab 上。
  4. 重新打开您的 Cardboard 场景并将新的 videosphere 预制件拖到您的层次结构中。
  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”的一部分。

很确定这就是一切。希望它可以帮助其他人解决这个问题。

最后请注意,视频只会在设备上呈现。在编辑器中,您只会在球体上看到白色纹理。您必须发布到设备才能看到精彩的 360 度视频。

【讨论】:

    【解决方案2】:

    我终于解决了。

    我们必须删除 CardboardAppController 和 MMTAppController 并将它们合并为一个。

    在 Assets/Plugin/ios 中基本上有 2 个 AppController:“CardboardAppController.mm”(也有 CardboardAppController.h 标头)和“MMTAppController.mm”

    诀窍在于 ios 在生成后只能“看到”一个应用控制器。由于 CardboardAppController 先出现,MMTAppController 被丢弃。

    为了解决这个问题,我做了以下工作:

    创建新的 AppController:在我的例子中,它被命名为 SVAppController.mm 和 SVAppController.h

    然后我们必须将两个应用控制器合并到那个中并删除它们。

    所以我将 CardboardAppController.h 的内容复制粘贴到 SVAppController.h 中,并将 CardboardAppController.mm 的内容复制到 SVAppController.mm 中(确保将代码中的名称更改为 SVAppController 替换 CardboardAppController em>

    然后将 MMTAppController.mm 的内容复制过去到 SVAppController.mm 在正确的位置

    最后删除 CardboardAppController 和 MMTAppController。

    您将剩下 1 个应用控制器,一切都应该正常工作。

    供参考 这是我最终的 SVAppController:

    SVAppController.h

    #import "UnityAppController.h"
    #import "UnityAppController+Rendering.h"
    #import "UnityAppController+ViewHandling.h"
    
    // Unity 4.6.2 added a category to the app controller.
    #if UNITY_VERSION < 462
    #import "UnityInterface.h"
    #else
    #import "UnityAppController+UnityInterface.h"
    #endif
    
    // Unity 4 used a different method name to create the UnityView.
    #if UNITY_VERSION < 500
    #define createUnityView initUnityViewImpl
    #endif
    
    @interface SVAppController : UnityAppController
    
    - (void)preStartUnity;
    
    - (UnityView *)createUnityView;
    
    - (void)startSettingsDialog:(UIViewController *)dialog;
    
    - (void)stopSettingsDialog;
    
    - (void)pause:(bool)paused;
    
    - (void)shouldAttachRenderDelegate;
    
    @end
    

    SVAppController.mm

    #import "SVAppController.h"
    #import "CardboardView.h"
    #import <UIKit/UIKit.h>
    extern "C" {
    
        extern void readProfile();
        extern void syncProfile();
    
        extern "C" void MMTUnitySetGraphicsDevice(void* device, int deviceType, int eventType);
        extern "C" void MMTUnityRenderEvent(int marker);
    
        extern UIViewController* createSettingsDialog(id app);
        extern UIViewController* createOnboardingDialog(id app);
    
        bool isOpenGLAPI() {
    #if UNITY_VERSION < 463
            return true;
    #else
            SVAppController* app = (SVAppController *)GetAppController();
            UnityRenderingAPI api = [app renderingAPI];
            return api == apiOpenGLES2 || api == apiOpenGLES3;
    #endif
        }
    
        void launchSettingsDialog() {
            SVAppController* app = (SVAppController *)GetAppController();
            [app startSettingsDialog:createSettingsDialog(app)];
        }
    
        void launchOnboardingDialog() {
            SVAppController* app = (SVAppController *)GetAppController();
            [app startSettingsDialog:createOnboardingDialog(app)];
        }
    
        void endSettingsDialog() {
            SVAppController* app = (SVAppController *)GetAppController();
            [app stopSettingsDialog];
        }
    
    }  // extern "C"
    
    @implementation SVAppController
    
    - (void)preStartUnity {
        [super preStartUnity];
        syncProfile();
    }
    
    - (UnityView *)createUnityView {
        return [[CardboardView alloc] initFromMainScreen];
    }
    
    - (void)startSettingsDialog:(UIViewController*)dialog {
        [self pause:YES];
        [self.rootViewController presentViewController:dialog animated:NO completion:nil];
    }
    
    - (void)stopSettingsDialog {
        [[self rootViewController] dismissViewControllerAnimated:NO completion:nil];
        [self pause:NO];
    }
    
    - (void)pause:(bool)paused {
    #if UNITY_VERSION < 462
        UnityPause(paused);
    #else
        self.paused = paused;
    #endif
    }
    
    - (void)shouldAttachRenderDelegate;
    {
        UnityRegisterRenderingPlugin(&MMTUnitySetGraphicsDevice, &MMTUnityRenderEvent);
    }
    
    @end
    
    IMPL_APP_CONTROLLER_SUBCLASS(SVAppController)
    

    【讨论】:

    • 不错的收获,就像一个魅力。插件的帧率是否正常?我的测试视频在设备上的 FPS 有点慢。
    • @TiborUdvari 我会说在较新的设备上帧速率不错,我得到了大约 30。但在旧设备上,有时它会降至 24,这使得它有点笨拙。但总的来说我还可以
    • 所以我在我的 iPhone5S 上进行了几次测试,它在 480p 的视频中看起来很流畅,然后它开始变得非常滞后。你用什么尺寸的球体?
    • 有没有人能够验证这个答案?而且,它不需要任何额外的 Unity 插件就可以工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多