我正在制作一个C#应用程序以从avermedia pcie采集卡捕获图形。但是似乎没有现成的工具可以这样做。因此,我制作了一个C ++ DirectShow应用程序来进行捕获,这是一个控制台应用程序,运行时会打开一个捕获窗口。如何将输出重定向到C#应用程序?例如,要一个CaptureElement?
因此,您想将XAML CaptureElement连接到AverMedia PCIe采集卡。这听起来似乎是一个容易理解的挑战,但是您提到的所有其他技术最终都是一个糟糕的选择:DirectShow,带有管道的多个应用程序,将cutsom代码重定向和适合XAML CaptureElement控件。
Microsoft故意限制了您可以集成不同API的方式,因此没有太多方法可以将所有内容整合在一起。
让我们回顾一下假定的集成路径。该采集卡应该与兼容的驱动程序一起提供:
在这种情况下,此类设备对于处理任务之间的视频捕获的Media Foundation API可见。XAML CaptureElement可以通过此API查看视频捕获设备,这样一来,一切都可以正常运行,而无需从头开始安装任何东西。
如果这没有发生,则表明您正在处理不支持或不兼容驱动程序的设备。
Windows中以前的媒体API是DirectShow,但是它的日子已经一去不复返了。它仍然可以作为遗留框架正常工作,许多应用程序仍然依赖它。具体来说,它将不会与XAML和UWP等新技术集成。更重要的是,就最新技术而言,即使是公开发行的Media API本身,也包括Media Foundation本身,也落后于后者。话虽如此,如果可能的话,最好不要在这里使用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
这还需要您在其中进行更多的开发工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句