目录
介绍
什么是DirectShow?
DirectShow的优缺点
优点
缺点
DirectShow渲染图
托管库作为DirectShow的包装器
使用Camera_Net
获取可用设备列表
Moniker(设备标识)
获取可用分辨率列表
开始相机输出
关闭相机
还有更多!
许可证
Camera_NET库许可证
示例许可证
Credits
相关开源项目的链接
- 下载已编译的示例 v1.1.2 - 170.8 KB
Camera_Net库使用的复杂示例。电视上的陌生人。
本文介绍了一个用于在.NET中轻松处理相机和视频输入的库Camera_Net。库使用DirectShow并包含使用示例:两个简单示例和一个复杂示例。
介绍 什么是DirectShow?首先,在本文中,我们将使用DirectShow来渲染来自摄像机的视频流。那么什么是DirectShow?DirectShow是微软开发的多媒体框架。这个框架非常强大和复杂,几乎可以制作一个家庭半专业的视频工作室。但是这种巨大的复杂性使其难以使用。您需要编写大量代码才能将网络摄像头中的视频简单地呈现到您的应用程序表单中。
DirectShow的优缺点 优点- 强大。它可以做你需要的一切。如果没有,请编写您的过滤器并在过滤器图中使用它们。
- 操作系统的一部分。所有Windows版本(XP、Vista、7、8)都支持它。无需安装任何东西。
- 得到所有供应商的支持。几乎您可以购买的每台相机都有驱动程序可以很好地与DirectShow配合使用。
- 它不是跨平台的。它基于COM技术,不是跨平台的。它只在Windows上运行良好。它也是一个专有框架,就像微软所做的大多数事情一样。但是,如果您使用托管代码(例如C#),您的应用程序可能已经 不是跨平台的。
- 本地代码。该框架不支持托管API。但是您可以使用像DirectShowNet库这样的开源包装器来克服这个缺点。
- 过于复杂和低级,无法使用。要渲染您的网络摄像头,您应该进行大量编码工作。但是使用本文中的Camera_Net库之类的包装器,您可以轻松地用相机做很多事情。
因此,是否使用DirectShow取决于您,因为它有优点和缺点。但如果你这样做,也许这篇文章适合你。
DirectShow渲染图DirectShow中音频/视频渲染的主要思想是构建一个过滤器图并运行它。Filter Graph — 是带有块的图(图过滤器)。这些块中的一些是视频/音频源(例如相机、调谐器),一些是渲染器,而另一些是可以改变或转换多媒体流的过滤器。这些图形过滤器也有引脚——用于将过滤器相互连接的点。因此,相机有一个或多个输出引脚,渲染器有输入引脚,而大多数其他过滤器都有这两种类型。
要渲染您的相机,您可以制作一个非常简单的过滤器图:
源过滤器连接到简单的视频渲染器。源过滤器是可用的,因为操作系统找到了它,有时在供应商的相机驱动程序的帮助下。渲染是标准过滤器,您可以将其视为DirectShow框架的一部分。没有使用额外的过滤器。
假设我们要拍摄视频流的照片并绘制视频输出(视频叠加)。图表会变得更复杂:
这里的Tee Filter是一个标准的过滤器来复制多媒体流。它的一个输出流用于渲染,另一个用于SampleGrabber拍照(快照)。SampleGrabber是用于从视频流中获取帧的标准过滤器。在此图中,使用了视频混合渲染器而不是简单的视频渲染器过滤器。Video Mixing Renderer是一个标准过滤器,支持渲染输出的视频叠加。
如果源过滤器(相机、调谐器)具有不同的输出多媒体格式(媒体类型),则可能需要添加额外的中间过滤器以进行动态转换。它使过滤器图更大更复杂:
DirectShow可以通过枚举安装在操作系统中的可用中间过滤器并自行选择一个以“智能”方式连接具有不同媒体类型的引脚,但结果有时可能不如您预期的那么好。
过滤器图图像是在开源工具GraphStudioNext中制作的,我推荐给所有使用过滤器图的人。它是一个很棒的免费软件工具,用于构建和调试过滤器图。它是作为Microsoft过时的错误GraphEdit的替代品而制作的。
托管库作为DirectShow的包装器要忽略DirectShow图形的所有这些混乱,我建议使用托管包装器,它将隐藏所有这些低级魔法。它将允许您克服DirectShow的第三个缺点——复杂性和低级编码。
在本文中,我将描述Camera_Net库的用法和功能。创建这个库是因为我无法在数十个开源解决方案中找到一个支持我想要的库:轻松使用相机作为托管组件、更改相机分辨率、拍摄帧快照、显示叠加图像框架。所以创建了这个库!
这个库的一些特性:
- 选择相机
- 选择分辨率
- 显示相机的输出
- 在框架上叠加图像
- 拍摄帧的快照
- 更改电视模式(PAL、NTSC等)
- 显示相机的对话窗口(来自驱动程序)
- 获取可用相机和分辨率的列表
类CameraControl和Camera是库中的主要类。Camera是一个与相机交互的类。CameraControl是一个Camera类的UserControl包装器,开箱即用,易于使用。
此外,还有几个public类:Resolution、VideoInput、相机选择类等。该库使用DirectShowLib(许可证LGPL 2.1或更高版本),它是DirectX COM接口的非常薄的包装,因此使用托管代码会降低生产力而不是原生的是最小的。
库和示例的所有来源都可以在GitHub上找到。您可以在那里发布问题、拉取请求或分叉。
DirectShow仅适用于Windows,因此该库也仅适用于Windows。
使用Camera_Net使用这个库最简单的方法是将它作为Control.添加到你的应用程序中。类CameraControl(继承自 UserControl)对此负责。推荐这种方法。
该库包括WinForms中的使用示例,特别是应用程序中组件的简单实现示例,以及显示该库几乎所有功能的更复杂示例。
因此,将库项目或已编译的程序集添加到引用中,添加CameraControl到您的应用程序并添加using指令:
using Camera_NET;
using DirectShowLib;
首先,您可能想要获取系统中可用摄像机和视频输入的列表:
// Camera choice helper class
CameraChoice _CameraChoice = new CameraChoice();
_CameraChoice.UpdateDeviceList();
现在_CameraChoice.Devices包括所有可用的设备(它是List)。如果DirectShow没有找到任何设备,该列表将为空。
在示例中,您可以通过ComboBox-es看到带有相机和分辨率选择的整个代码,其中包含人类可读的相机名称。为了使这篇文章简短,让我们简单地使用第一个(零索引)。
Moniker(设备标识)在DirectShow方面,摄像头设备有一个唯一的标识——一个Moniker(更多信息请阅读System.Runtime.InteropServices.ComTypes.IMoniker接口)。
您可以通过以下DsDevice的Mon属性获得设备的名称:
var moniker = _CameraChoice.Devices[your_index].Mon;
您可以使用以下功能获取可用分辨率列表(相机的驱动程序支持此static函数Camera.GetResolutionList(moniker)):
ResolutionList resolutions = Camera.GetResolutionList(moniker);
最后,当您选择相机设备和分辨率后,您可以将相机设置为CameraControl:
cameraControl.SetCamera(moniker, resolutions[your_index_of_resolution]);
或者您可以从默认分辨率开始(通常是640x480的VGA模式,但并非总是如此):
cameraControl.SetCamera(moniker, null);
在更换相机或退出应用程序时,您可以(并非总是必要)关闭当前相机:
cameraControl.CloseCamera();
它将为其他应用程序释放相机,处理DirectShow图形和其他一些资源。
还有更多!库允许更多:
- 拍摄视频输出SnapshotOutputImage()的快照或源帧的快照SnapshotSourceImage()。
- 在视频上显示叠加图像(位图),混合器支持透明度(属性MixerEnabled、OverlayBitmap、GDIAlphaValue、GDIColorKey等)。
- 使用带交叉开关的视频输入设备并使用交叉开关 ( CrossbarAvailable, VideoInput)。
- 显示相机的对话窗口(来自驱动程序):DisplayPropertyPage_Device(), DisplayPropertyPage_Crossbar(),DisplayPropertyPage_CaptureFilter()
- 使用电视模式(PAL、NTSC等):SetTVMode(), GetTVMode()。
- 更改相机和分辨率(再次使用SetCamera())。
有关更多信息,您可以查看库中包含的示例。
一个简单的示例应用程序作为Camera_Net库使用的示例。
许可证 Camera_NET库许可证该库是免费软件;您可以根据自由软件基金会发布的GNU宽松通用公共许可证的条款重新分发和/或修改它;许可证的3.0版或(由您选择)任何更高版本。分发这个库是希望它有用,但没有任何保证;甚至没有对适销性或特定用途适用性的默示保证。有关更多详细信息,请参阅GNU通用公共许可证。
示例许可证虽然该Camera_Net库由LGPL覆盖,但示例以PUBLIC DOMAIN的形式发布。因此,您可以在您的免费或专有项目中使用这些示例中的代码,而不受任何限制。
Credits这篇文章的作者和Camera_Net库是free5lot。库和示例的所有来源都可以在 github上找到。
该项目使用LGPL 2.1 或更高版本涵盖的库DirectShowLib(DirectShow.Net 库)。
相关开源项目的链接- DirectShow.NET 库 (DirectShowLib)
- GraphStudioNext
- DirectX.Capture 类库 - CodeProject
- Emgu CV:.NET 中的 OpenCV
- 开放式简历 | 开放式CV
- C# 中的图像处理实验室 – CodeProject
- 多功能网络摄像头 C# 库 – CodeProject
- Camera Vision(C# 上的视频监控) – CodeProject
https://www.codeproject.com/Articles/671407/Camera-Net-Library