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

问题描述 投票:1回答:1

我正在制作一个C#应用程序来捕获来自avmedia pcie采集卡的图形,但似乎没有任何开箱即用的工具,所以我制作了一个C++ directshow应用程序来进行捕获,这是一个控制台应用程序,并在运行时打开一个捕获窗口。

c# c++ wpf directshow ms-media-foundation
1个回答
0
投票

所以你想让XAML CaptureElement连接到AverMedia PCIe采集卡。这听起来是一个很好理解的挑战,然而你提到的其他每一项技术最终都是一个不好的选择。DirectShow,多个应用程序的管道,重定向和切分代码到XAML CaptureElement控件的装配。

微软有意限制了你整合不同API的方式,所以没有那么多的方式可以把所有的东西整合在一起。

让我们来回顾一下所谓的集成路径。采集卡在出厂时应该会有一个兼容的驱动程序。

视频采集设备是通过UVC类驱动程序来支持的,并且必须与UVC 1.1兼容。

当这种情况下,这样的设备对于处理视频捕获任务中的Media Foundation API来说是可见的。XAML CaptureElement将能够通过这个API看到一个视频捕获设备,这样的话,所有的东西都应该是工作的,而不需要从你的端部安装任何东西。

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

之前在Windows中的媒体API是DirectShow,但它的时代已经过去了。它作为一个传统的框架仍然完美的工作,很多应用程序仍然依赖于它。具体来说,它不会与XAML和UWP等新技术集成。更重要的是,即使是Media Foundation本身,也就是目前的媒体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 然而这也需要你在里面投入更多的开发精力。

© www.soinside.com 2019 - 2024. All rights reserved.