博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让OMCS支持更多的视频采集设备
阅读量:7237 次
发布时间:2019-06-29

本文共 2926 字,大约阅读时间需要 9 分钟。

  有些OMCS用户在他的系统使用了特殊的视频采集卡作为视频源(如AV-878采集卡),虽然这些采集卡可以虚拟为一个摄像头,但有些视频采集卡需要依赖于自带了sdk才能正常地完成视频采集工作。在这种情况下,OMCS是不直接支持这些采集卡的。我们的思路是使OMCS具有自定义扩展的能力:我们让OMCS提供了扩展接口,让使用者可以向OMCS框架中注入其自己的视频采集程序。使用者要达到这种自定义的扩展相当简单,只需实现两个接口即可。

1.IVideoCapturer接口

  OMCS.Engine.Video.IVideoCapturer定义了视频采集器的基本功能,其用于采集RGB24格式的图像,其定义如下:

public interface IVideoCapturer :IDisposable    {        ///         /// 要采集的视频大小(分辨率)        ///         Size VideoSize { get; }        ///         /// 采集的帧频        ///         int FrameRate { get; }        ///         /// 是否正在采集?        ///         bool IsCapturing { get; }        ///         /// 开始采集        ///         void Start();        ///         /// 停止采集        ///         void Stop();             ///         /// 当采集完一帧时,触发此事件。事件参数为图像数据。        ///         event CbGeneric
VideoCaptured; ///
/// 当采集发生错误时,触发此事件。 /// event CbGeneric
VideoError; ///
/// 当采集的分辨率发生变化时,触发此事件。 /// event CbGeneric
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    {        ///         /// 创建一个新的视频采集器实例。        /// 如果返回null,则表示使用框架内置的视频采集器。        ///         /// 摄像头索引        /// 要采集的视频大小(分辨率)        /// 采集的帧频             IVideoCapturer CreateVideoCapturer(int deviceIndex, Size videoSize, int frameRate);        ///         /// 获取视频采集器支持的采集分辨率。        /// 如果返回null,则表示指示框架自己去获取这些信息。        ///         /// 摄像头索引              List
GetCameraCapability(int deviceIndex); }

可以按如下逻辑来实现IVideoCapturerFactory的两个方法:

(1)实现CreateVideoCapturer方法:判断deviceIndex所对应的视频设备是否是特殊的类型,如果是,则new一个我们刚实现的视频采集类的实例返回;如果不是,则返回null,表示使用框架内置的视频采集程序。

(2)实现GetCameraCapability方法:判断deviceIndex所对应的视频设备是否是特殊的类型,如果是,则把该设备支持的所有分辨率放入列表中返回;如果不是,则返回null,以指示框架自己获取目标设备的分辨率信息。

3.注入到OMCS

  在调用IMultimediaManager的Initialize方法之前,先new一个上面实现的Factory类,然后将其赋值给IMultimediaManager的VideoCapturerFactory属性。这样,就完成对OMCS视频设备的扩展。

 

 

转载地址:http://sxofm.baihongyu.com/

你可能感兴趣的文章
getline()函数
查看>>
java1.8的几大新特性(二)
查看>>
atitit.跨语言实现备份mysql数据库 为sql文件特性 api 兼容性java c#.net php js
查看>>
ubuntu 安装mysql, 以及全然又一次安装的方法
查看>>
startActivityForResult不返回结果
查看>>
[Hapi.js] Request Validation with Joi
查看>>
[转]highcharts图表入门之:如何让highcharts图表自适应浏览器窗体的大小或者页面大小...
查看>>
Ant搭建 一键生成APP技术 平台
查看>>
Mahout贝叶斯算法拓展篇3---分类无标签数据
查看>>
TCP/IP ---分层
查看>>
/dev/null简介
查看>>
uber优步提高成单率,轻松拿奖励!
查看>>
Redis源代码分析(三十五)--- redis.c服务端的实现分析(2)
查看>>
PV(访问量)、UV(独立访客)、IP(独立IP) (转)
查看>>
docker数据拷贝
查看>>
shiro realm 注解失败问题解决过程
查看>>
iOS 静态库,动态库与 Framework 浅析
查看>>
Java对ArrayList进行排序
查看>>
NumberFormat
查看>>
Spring WebSocket初探1 (Spring WebSocket入门教程)<转>
查看>>