让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-11-04 06:10:49

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

基于VFW视频采集及数据处理

准备工作:建立基于对话框的程序,并添加控件及需要的成员变量: 1.     采用capCreateCaptureWindow函数创建视频采集窗口 m_CapWnd =capCreateCaptureWindow(_T("My Video Capture"), WS_CHILD | WS_VISIBLE,0, 0, LocalRect.Width(),LocalRect.Height(), LocalWnd->GetSafeHwnd(),IDC_VIDEO_LOCAL); // m

Windows Media Foundation 音视频采集 小记

写在前面 我是个讲文明的人…… 不过有的时候实在忍不住了也要吐槽几句: 1. 我真是跟不上时代,到现在了还在研究 Windows 应用开发…… 咳: 2. DirectShow 是傻X!我只是想要获取 Camera 裸数据,尼玛却要让我学习神马各种 .ax, filter, graph... 相关资料少.又晦涩: 3. 在此祝愿 Windows XP 及其之前的版本早点退出历史舞台,这样 DirectShow 就不是必须的了! 音视频采集 Windows 7 以后, Media Foundati

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

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

【Discuz插件】视频专题 2.2.6 支持手机版、门户和一键视频采集功能,搭建在线视频网站

视频专题 2.2.6 Discuz视频插件是我个人用过的最好用的Discuz插件,在所有的做视频网址的Discuz插件当中,视频专题 2.2.6 Discuz视频插件是最人性化,最简单易用,最稳定的一个插件.不信的话,你尽管去找各种各样的视频插件,你用过之后,再来对比,保证你感叹事实如此!我找过用过的discuz视频插件,也不少了,简单好用的就是这个视频专题 2.2.6了!因此,做discuz的大神们,绝对不要错过这样一个好插件!!!! 真心感受,罗列一下: 就是优酷土豆这种视频播放网站的界面,

(转)摄像头视频采集压缩及传输

引言:摄像头基本的功能还是视频传输,那么它是依靠怎样的原理来实现的呢?所谓视频传输:    就是将图片一张张传到屏幕,由于传输速度很快,所以可以让大家看到连续动态的画面,就像放电影一样.一般当画面的传输数量达到每秒24帧时,画面就有了连续性.下边我们将介绍摄像头视频采集压缩及传输的整个过程.一.摄像头的工作原理(获取视频数据)摄像头的工作原理大致为:景物通过镜头(LENS)生成的光学图像投射到图像传感器表面上,然后转为电信号,经过A/D(模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(

嵌入式视频采集编程思路(Video 4 Linux)-转

转自:http://zyg0227.blog.51cto.com/1043164/271954 1.  linux 内核有video for linux简称V4L.V4L是Linux影像系统与嵌入式影像的基础,是Linux kernel里支持影像设备的一组APIs,配合适当的视频采集卡与视频采集卡驱动程序,V4L可以实现影像采集.AM/FM无线广播.影像CODEC.频道切换等功能.目前,V4L主要应用在影像串流系统与嵌入式影像系统里,其应用范围相当广泛,例如:远程教学.远程医疗.视频会议.视频监

涉江采芙蓉——语音视频采集详解(源码赠送)

对于OMCS而言,采集是第一个环节.所谓“巧妇难为无米之炊”,首先我们要从多媒体设备上拿到第一手材料.对于音频而言,就是要从麦克风.声卡等设备获取到音频信号:对于视频而言,就是要从显示器.摄像头等设备获取到图像信息.如何获取到这些信息呢?于是我们需要采集. 所谓采集又可以拆分成采样和集聚两个步骤来理解.这就好比“曹聪称象”,先将大的总体分解成一个个样本,再将分解得到的样本整合起来,其思想无非就是用样本来模拟总体.  (1)对于视频而言,采集的过程就如同下图所示 我们知道,视频总是连续的,但是我们

Window 下 VFW 视频采集与显示

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

手机Android音视频采集与直播推送,实现单兵、移动监控类应用

恰逢2014 Google I/O大会,不难看出安卓在Google的推进以及本身的开放性作用下,已经快延生到生活的各个方面了,从安卓智能手机.平板,到可穿戴的Android Ware.眼镜.手表.再到Android汽车.智能家居.电视,甚至最近看新闻,日本出的几款机器人都是Android系统的,再把目光放回监控行业,传统监控中的移动终端设备,例如:单兵设备.手持设备.车载终端设备,包括家庭监控中用到的智能设备,都可以用Android系统替代了,不仅开发容易,而且易扩展,设备也更加智能了. 图 -