因此您希望将 XAML CaptureElement 连接到 AverMedia PCIe 采集卡。总体而言,这听起来像是一个很好理解的挑战,但是您提到的所有其他技术最终都是一个糟糕的选择:DirectShow、具有管道、重定向和将 cutsom 代码拟合到 XAML CaptureElement 控件的多个应用程序。
Microsoft 有意限制了您可以集成不同 API 的方式,因此没有太多方法可以将所有内容整合在一起。
让我们回顾一下假定的集成路径。采集卡应该附带兼容的驱动程序:
Video capture devices are supported through the UVC class driver and must be compatible with UVC 1.1
在这种情况下,此类设备对处理任务间视频捕获的 Media Foundation API 可见。 XAML CaptureElement 将能够通过此 API 看到视频捕获设备,这样一切都应该可以正常工作,而无需从您的终端安装任何东西。
如果没有发生这种情况,则表明您正在处理没有合适或兼容驱动程序的不受支持的设备。
Windows 中以前的媒体 API 是 DirectShow,但它的日子已经一去不复返了。它仍然完美地作为一个遗留框架运行,许多应用程序仍然依赖它。具体来说,它不会与 XAML 和 UWP 等新技术集成。更重要的是,即使是媒体基金会本身,即当前的媒体 API,在其公开发行的产品中,在适应最新技术方面也落后。话虽如此,如果可能的话,最好远离 DirectShow。
我认为不需要通过管道在流程之间传输视频的跨流程设计。这种设计没有充分的理由,即使它可以有效地工作(Windows 本身通过在其中具有所谓的 Frame Server 服务证明它在性能方面可以很好地工作),但这不是建立在管道上的。在您的情况下,也不太可能必须建立在多个进程上。相反,您可以开发一个本机代码 DLL 项目,该项目负责视频采集并通过合适的粘合层连接到托管代码:C++/CLI、COM、C++/WinRT 等。
接下来就是适合 XAML CaptureElement。该控件旨在与与硬件对话的Windows.Media.Capture.MediaCapture 类一起使用,并且您没有合适的硬件,因为您计划实现自己的采集层。长话短说,您不应该将外部数据转发给 CaptureElement,您将很难做到这一点。您最好的策略是将外部获取的数据上传到Windows.Graphics.Imaging.SoftwareBitmap 或类似地址,并将所涉及的性能影响视为可接受的。也就是说,您将视频帧作为图像处理。
另一种方法是将获取的视频帧上传到 Direct 3D 11 纹理中,这将为您提供一种与视频相关控件集成的更高效的方式,例如 Windows.UI.Xaml.Controls.SwapChainPanel 但它也需要您投入更多的开发工作在那里。