如何将 directshow 应用程序 (C++) 的输出转发到 C# 应用程序?

How to forward output of a directshow app(C++) to a C# app?

我正在制作一个 C# 应用程序来从 avermedia pcie 采集卡采集图形。 但似乎没有开箱即用的工具可以这样做。 所以我制作了一个 C++ directshow 应用程序来进行捕获,这是一个控制台应用程序,并在 运行 时打开捕获 window。 如何将输出重定向到 C# 应用程序?例如,到 CaptureElement?

所以你想要 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

在这种情况下,媒体基金会可以看到此类设备 API 在任务中处理视频捕获。 XAML CaptureElement 将能够通过此 API 看到视频捕获设备,这样一切都应该正常工作,而无需安装任何东西。

如果没有发生这种情况,则表明您正在处理没有合适或兼容驱动程序的不受支持的设备。

Windows 中的先前媒体 API 是 DirectShow,但它的日子已经一去不复返了。它仍然作为一个遗留框架完美地工作,许多应用程序仍然依赖它。具体而言,它不会与 XAML 和 UWP 等新技术集成。更重要的是,即使是 Media Foundation 本身,当前的媒体 API 在其 public 产品中也落后于适应最新技术。话虽如此,如果可能的话,最好在此处远离 DirectShow。

我认为不需要跨流程设计,视频通过管道在流程之间传播。这样的设计没有充分的理由,即使它可以有效地工作(Windows 本身证明它可以通过其中的所谓的 Frame Server 服务在性能方面工作得很好),这不是建立在管道上.在您的情况下,也不太可能必须建立在多个进程上。相反,您可以开发一个本机代码 DLL 项目,该项目负责视频采集并通过合适的胶层连接到托管代码:C++/CLI、COM、C++/WinRT 等。

接下来就是适合 XAML CaptureElement。该控件旨在与与硬件对话的 Windows.Media.Capture.MediaCapture class 一起使用,但您没有合适的硬件,因为您打算实现自己的采集层。长话短说,您不应该将外部数据转发到 CaptureElement,您将很难做到这一点。您最好的策略是将外部获得的数据上传到 Windows.Graphics.Imaging.SoftwareBitmap 或类似的地方,并将所涉及的性能影响视为可以接受的。也就是说,您将把视频帧作为图像处理。

另一种方法是将获取的视频帧上传到 Direct 3D 11 纹理中,这将为您打开一种与视频相关控件集成的更高效的方式,例如 Windows.UI.Xaml.Controls.SwapChainPanel 但是它还需要您将那里有更多的开发工作。