让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视频设备的扩展。

 

 

时间: 2024-09-25 07:50:38

让OMCS支持更多的视频采集设备的相关文章

让WPS演示支持更多的视频(影片)格式

视频在WPS中称为影片,视频由于其时空连续性,具有非常丰富的信息内涵,具备更强.更生动.更自然的表现力,易于被人们接受;在课件中引入视频,能很好地创设情境,表现"过程",交待事件的始末,从而激发学生学习兴趣,突破教学难点和重点,提高教学效果. 视频素材来源丰富,我们可以通过用数码摄像机(DV).数码照相机(DC).数码摄像头.手机等设备拍摄获得,可以从网络搜寻和下载获取,也可以从光盘中拷贝和从电脑屏幕中录制.但由于应用领域的不同,使用的数字视频压缩技术也不同,产生了相当多种类的数字视频

如何让Vista梦幻桌面支持更多格式视频

Windows Vista 梦幻桌面(DreamScene)到底能不能支持除了Mpeg/mpg以外的格式? 很多人说梦幻桌面的视频格式有限,像AVI.RM.RMVB就不能做成梦幻桌面!也有很多朋友着急在Vista之家论坛提问:我的高清avi视频想做梦幻桌面怎么办?还要转格式,浪费时间又损坏品质! 别着急,我们按照下面几步来,彻底解决这个问题,让你的Windows Vista 梦幻桌面支持更多的格式! 1.首先要让WMP(Windows Media Player)支持更多的格式.方法当然是安装Vi

让Windows 7媒体支持更多视频格式

在欣赏各种视频文件时,相信大家一般都选择暴风影音来播放,而主要原因就是暴风影音支持大部分的视频格式.其实在Win 7中,利用自带的媒体中心就可以播放各种视频文件.下面,笔者就给大家介绍一下如何让媒体中心支持更多的视频格式. 首先从下载专门为Win 7量身定做的解码包Win7codecs(网上自己搜一搜),接着一路单击"下一步"按钮,按照提示完成解码包的安装.安装完成,就可以使用媒体中心来播放RM.RMVB.AVI等常见的视频文件了. 右击硬盘中已存在的某种格式的视频文件(如RM格式),

win7让媒体支持更多视频格式

  Win7从上市发售到现在,时间已经不算短了,可是Win7这股热潮一直都还不退却,任然是人们争先购买的人们产品,这么受欢迎的原因不外乎还是那几点:正版Win7给电脑带来便捷和保护,使电脑运行更快.更强.更安全. 当我们欣赏各种视频文件时,相信大家一般都选择暴风影音来播放,而主要原因就是暴风影音支持大部分的视频格式.其实在Win 7中,利用自带的媒体中心就可以播放各种视频文件.下面,笔者就给大家介绍一下如何让媒体中心支持更多的视频格式. 首先从下载专门为Win 7量身定做的解码包Win7code

用DirectShow实现视频采集-流程构建

DirectShow作为DirectX的一个子集,它为用户提供了强大.方便的多媒体开接口,并且它拥有直接操作硬件的能力,这使得它的效率远胜于用GDI等图形方式编写的多媒体程序.前面一篇文章已经对DirectShow作了粗略的介绍,阐述了它的原理及一些编程方法.这里结合实践中运用DirectShow实现视频采集(WIN32)来加深对DirectShow的理解和操作能力. 1.系统环境及开发环境    l       系统支持DirectX(Win 2K以上系统) l       VC++  6.0

LineageOS 本周再获更新:新增支持更多设备

尽管发布仅仅只有数月的时间,但是Lineage OS支持的设备数量已经超过80款,甚至于上个月的装机量突破100万次.同往常一样,团队依然致力于支持更多的设备,并为系统带来更多的细节改善.N分支已经迁移至Android 7.1.2系统,并包含来自于Google的最新安全补丁. 1484972401_lineage_os.gif 在最新版本中并未带来太大的调整,主要修复了导致不必要电池干耗的问题,完整更新列表如下: 修复了导致电池使用问题的Extra Tiles问题 诸多细节方面的BUG修复 网站

海康威视频监控设备Web查看系统(一) 概要篇

题外话: 为什么在开始之前先说题外话呢?主要是为了怕有人误会,以为这里要写的是一个关于视频流处理的文章.其实这个系列的几篇文章可能和视频流的处理半毛钱关系都没有,冲着视频技术来的看官们,可能让你们失望了.这个系列里主要涉及的技术大概有.net的socket处理,C#写ActiveX插件,少量的线程处理,以及对非托管C++库的调用. 另一方面,这个系列文章说的是一个综合的小项目,没有复杂的功能,没有严谨的项目管理过程,但却有一个技术探索的一般过程.好了,题外话到此结束,下面是正题了. 需求描述:

(DirectX系列05)DirectShow 视频采集

    前几小节陆续介绍了Directsound.Directshow音频处理方面的技术,还没有介绍视频方面的技术,从这节开始介绍视频采集方面的技术.今日刚好就介绍Directshow视频采集技术,其实DirectShow视频采集并不复杂,复杂的部分微软已经帮做好了,只需按照顺序将API连接起来即可,如下所叙述: 系统设备枚举     系统设备枚举器为我们按类型枚举已注册在系统中的Fitler提供了统一的方法.而且它能够区分不同的硬件设备,即便是同一个Filter支持它们.这对那些使用Windo

Window 下 VFW 视频采集与显示

引言       经过几天的努力终于将VFW视频采集与显示功能完整实现了,不得不说网上对这方面完整的详细讲解文章是在太少了.所以就要本人来好好总结一下让后来者不再像我一样折腾好久.在本文中我将详细讲解VFW视频采集过程的实现,以及采集后视频的显示方法. VFW简介          虽然这是篇技术博文,但是我觉得用一个东西,那么关于它的概述还是不能少,所以特从百度上copy了下VFW的概念描述,如果读者不想看可以直接去观看正文部分.          VFW(Video for Windows)