WebView.CapturePreviewToStreamAsync() 失败,但仅在带有 Unity3D 的 HoloLens 上

WebView.CapturePreviewToStreamAsync() fails, but only on HoloLens with Unity3D

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

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

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

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

现在如果我们调用WebView组件的CapturePreviewToStreamAsync() API,一个 System.Exception 抛出消息: 灾难性故障(HRESULT 异常:0x8000FFFF (E_UNEXPECTED))

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

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

谢谢! 马丁

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

launch a 3D (Holograms) app from a 2D #XAML app and going back to it

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

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

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

问题解决了。现在 CapturePreviewToStreamAsync() 调用有效并且 returns 数据。

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

希望对某人有所帮助
马丁