首页 > 解决方案 > WebView.CapturePreviewToStreamAsync() 失败,但仅在具有 Unity3D 的 HoloLens 上

问题描述

目前,我们正在尝试在一个应用程序中结合使用 Unity3D 全息图和 HTML 渲染。这个想法的工作原理如下:

1) 启动一个 XAML 应用程序,其主窗口包含一个 WebView 组件(使用 XAML 应用程序模板)
2) 切换到全息 (DirectX) 模式(基本上从全息应用程序模板复制代码)
3) WebView 仍然在后台运行
4) 我们可以调用该WebView.Navigate()方法5) 通过API
将 WebView 的内容渲染为位图 6) 将位图转换为纹理并在 DirectX 端显示 - 从而使用全息图进行 HTML 渲染CapturePreviewToStreamAsync()

到目前为止,我们的实验适用于:
1) C++/CX
2) C#

但是,如果我们尝试用 Unity3D 做同样的事情,我们就会遇到问题。以下是我们所做的:
1) 我们创建一个支持混合现实的 Unity3D 项目
2) 我们导出 Unity 项目,并将“UWP 构建类型”设置为“XAML”(而不是 D3D)。该应用程序在 MSVS 2017 中构建,并作为 XAML 应用程序启动,该应用程序自动切换到全息空间,正确显示 Unity 中定义的场景。
3) 我们进一步编辑主 XAML 页面以包含 WebView 元素(指向网页)。

现在,如果我们调用CapturePreviewToStreamAsync()WebView 组件的 API,则会引发 System.Exception,并显示以下消息: Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))

如果我们同时使用 Hololens 眼镜和模拟器,错误是 100% 可重现的。

有什么建议可能是导致该行为的原因吗?似乎 Unity 以不同的方式创建应用程序 XAML 部分的主窗口,但我们无权访问它,因为窗口创建主要发生在重新编译的 Unity 模块中。

谢谢!马丁

标签: c#xamlunity3dwebviewhololens

解决方案


虽然我们找不到异常的原因,但我们找到了一种解决方法,按照 Jonathan Antoine 的这篇博客文章中的说明进行操作:

从 2D #XAML 应用程序启动 3D(全息图)应用程序并返回它

使事情起作用的方法是:
1. 从上面为 Unity3D 生成的应用程序创建一个新的 XAML 页面(我们将其命名为 WebViewPage,其中包含我们的 WebView 组件)
2. 修改 Unity 生成的 XAML 应用程序以在启动时导航到 WebViewPage到 MainPage
3. 当需要切换到全息空间时,只需按通常的方式导航到 MainPage:

    var frame = new Frame();
    Window.Current.Content = frame;
    frame.Navigate(typeof(MainPage));  

4.您可能还需要将appCallbacks对象从生成的应用程序从App类移动到MainPage

这解决了问题。现在CapturePreviewToStreamAsync()调用工作并返回数据。

注意:我们注意到应用程序离开 HoloLens 模拟器 (10.0.14393.1358) 处于某种状态,这不允许应用程序在不重新启动模拟器的情况下再次启动。但是这个问题并没有出现在真实的设备上

希望能帮助某人
马丁


推荐阅读