Hololens 2 上的 MediaPlayer 和 MediaStreamSource

MediaPlayer and MediaStreamSource on Hololens 2

我有一个基于 MediaPlayer 的解码器,它使用来自传入帧的实时流 H264 视频,使用 MediaStreamSource 并响应来自 MediaStreamSource.SampleRequested 的样本请求。这已集成到 Unity 中,以便在 IDirect3DSurface.

上显示这些帧

我很高兴在我的桌面上以 30fps 的速度运行,但是当 运行在 Hololens 2 上运行时,我只能在视觉上看到大约 5fps。

话虽如此,我在 MediaPlayer 代码中有许多指标显示示例请求、示例 resolutions/deferrals 和 VideoFrameAvailable 回调仍然以 30fps 的速度发生,就像它们在桌面上所做的那样。我没有丢失帧,更像是只有每个 X 帧实际得到显示,而中间帧则没有。最后,如果我使用通过同一管道从 URI 创建的测试 MediaSource 和 运行,我确实在 Hololens 2 上看到了 30fps,因此希望排除我的表面/显示逻辑的问题。

当附加调试器时,我确实看到 _com_errors 在 d3d11.dll CDecodeContext::BeginFrame 中引发了相当多的问题,但这些问题永远无法弥补我的代码,也许是无害的?参考:https://social.microsoft.com/Forums/azure/fr-FR/f76a80db-3bf0-49b1-8c4f-4d3b90c03f94/how-to-track-down-comerrors?forum=winappswithnativecode

这种流式传输是否存在任何特定于 Hololens 2 的已知问题?

如果需要,我可以 post 我的相关代码,但 C++ MediaPlayer 代码相当冗长,所以除非需要检查特定部分,否则我将推迟。它在桌面上运行良好的事实表明,从根本上来说不会有任何错误...希望...

编辑:出于好奇,我刚刚为 Hololens 1 重建了我的项目并对其进行了测试 - 一切都很好!这越来越指向 Hololens 2 MediaPlayer 实现中的特定问题?

经过一些调试和进一步研究,似乎在 ARM64 上 YUV 到 BGRA 的转换确实存在性能问题。我的解决方案是传递格式为 DXGI_FORMAT_NV12 的输出 IDirect3DSurface 并映射两个着色器资源视图(一个单通道 8 位 (DXGI_FORMAT_R8_UNORM) 和一个双通道 8+8 位(DXGI_FORMAT_R8G8_UNORM)) 以访问 Y 和 UV 平面。这允许 NV12 输出而没有任何性能问题。

在我的例子中,我可以在 GPU 上用着色器代码自己进行 YUV 到 RGB 的转换。

使我走上这条道路的参考文献在 ID3D12 文档中,但同样适用于 Direct3D 11:https://docs.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12device-createshaderresourceview