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



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

因此,您希望将XAML CaptureElement连接到AverMedia PCIe捕获卡。总的来说,这听起来是一个众所周知的挑战,但你提到的其他技术最终都是一个糟糕的选择:DirectShow、多个带有管道的应用程序、重定向和将cutsom代码适配到XAML CaptureElement控件。

微软有意限制您集成不同API的方式,因此没有太多方法可以将所有内容整合在一起。

让我们回顾一下所谓的整合路径。捕获卡应该与兼容的驱动程序一起发货:

视频捕获设备通过UVC类驱动程序支持,并且必须与UVC 1.1 兼容

在这种情况下,Media Foundation API在处理任务之间的视频捕获时可以看到此类设备。XAML CaptureElement将能够通过此API查看视频捕获设备,这样一切都可以工作,而无需安装任何来自您端的设备。

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

以前的媒体API在Windows是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(集成的更高性能的方式,但这也需要您投入更多的开发工作。

最新更新