让OMCS支持更多的视频采集设备
有些OMCS用户在他的系统使用了特殊的视频采集卡作为视频源(如AV-878采集卡),虽然这些采集卡可以虚拟为一个摄像头,但有些视频采集卡需要依赖于自带了sdk才能正常地完成视频采集工作。在这种情况下,OMCS是不直接支持这些采集卡的。我们的思路是使OMCS具有自定义扩展的能力:我们让OMCS提供了扩展接口,让使用者可以向OMCS框架中注入其自己的视频采集程序。使用者要达到这种自定义的扩展相当简单,只需实现两个接口即可。
1.IVideoCapturer接口
OMCS.Engine.Video.IVideoCapturer定义了视频采集器的基本功能,其用于采集RGB24格式的图像,其定义如下:
public interface IVideoCapturer :IDisposable { /// <summary> /// 要采集的视频大小(分辨率) /// </summary> Size VideoSize { get; } /// <summary> /// 采集的帧频 /// </summary> int FrameRate { get; } /// <summary> /// 是否正在采集? /// </summary> bool IsCapturing { get; } /// <summary> /// 开始采集 /// </summary> void Start(); /// <summary> /// 停止采集 /// </summary> void Stop(); /// <summary> /// 当采集完一帧时,触发此事件。事件参数为图像数据。 /// </summary> event CbGeneric<byte[]> VideoCaptured; /// <summary> /// 当采集发生错误时,触发此事件。 /// </summary> event CbGeneric<Exception> VideoError; /// <summary> /// 当采集的分辨率发生变化时,触发此事件。 /// </summary> event CbGeneric<Size> VideoSizeChanged; }
(1)在定义实现该接口的类时,可以通过类的构造函数传入三个参数:设备的Index、采集的分辨率、采集的视频帧率。
(2)OMCS会在合适的时候调用Start方法启动注入的采集器,采集器启动后,当每采集到一帧视频时,就触发VideoCaptured事件。OMCS内部预定了该事件,以获取采集到的图像数据。
(3)如果在采集的过程中,采集器发生了任何异常,请通过触发VideoError事件来通知OMCS框架。
(4)如果在采集的过程中,更改了采集器采集的分辨率,请通过触发VideoSizeChanged事件来通知OMCS。
请特别注意VideoCaptured事件参数的含义:它并不是一个Bitmap的完整数据,而是不包含位图header的核心数据(OMCS通过设定的采集的分辨率来推断位图header的信息)。从Bitmap转为不包含头的核心数据的代码如下所示:
public byte[] GetBitmapCoreData(Bitmap bm) { int buffSize =bm.Width * bm.Height * 24 / 8; byte[] destBuff = new byte[buffSize]; Rectangle bmRect = new Rectangle(new Point(0, 0), new Size(bm.Width, bm.Height)); BitmapData data = bm.LockBits(bmRect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); Marshal.Copy(data.Scan0, destBuff, 0, destBuff.Length); bm.UnlockBits(data); return destBuff; }
当然,如果视频采集器采集到的本来就是位图核心数据(通常情况下都是如此),就不需要这层转换了。
2.IVideoCapturerFactory接口
在实现完IVideoCapturer接口后,我们还需要实现简单的OMCS.Passive.IVideoCapturerFactory接口。
public interface IVideoCapturerFactory { /// <summary> /// 创建一个新的视频采集器实例。 /// 如果返回null,则表示使用框架内置的视频采集器。 /// </summary> /// <param name="deviceIndex">摄像头索引</param> /// <param name="videoSize">要采集的视频大小(分辨率)</param> /// <param name="frameRate">采集的帧频</param> IVideoCapturer CreateVideoCapturer(int deviceIndex, Size videoSize, int frameRate); /// <summary> /// 获取视频采集器支持的采集分辨率。 /// 如果返回null,则表示指示框架自己去获取这些信息。 /// </summary> /// <param name="deviceIndex">摄像头索引</param> List<CameraCapability> GetCameraCapability(int deviceIndex); }
可以按如下逻辑来实现IVideoCapturerFactory的两个方法:
(1)实现CreateVideoCapturer方法:判断deviceIndex所对应的视频设备是否是特殊的类型,如果是,则new一个我们刚实现的视频采集类的实例返回;如果不是,则返回null,表示使用框架内置的视频采集程序。
(2)实现GetCameraCapability方法:判断deviceIndex所对应的视频设备是否是特殊的类型,如果是,则把该设备支持的所有分辨率放入列表中返回;如果不是,则返回null,以指示框架自己获取目标设备的分辨率信息。
3.注入到OMCS
在调用IMultimediaManager的Initialize方法之前,先new一个上面实现的Factory类,然后将其赋值给IMultimediaManager的VideoCapturerFactory属性。这样,就完成对OMCS视频设备的扩展。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2011-04-08 聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)
2008-04-08 总裁与专才
2006-04-08 将权限引入系统的探索