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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GG是QQ的高仿版,包括客户端和服务端,可在广域网部署使用,目前最新版本为3.4。我想写一个类似汇总的文章,通过这篇文章,大家可以了解到GG的全貌和最新进展,以及关于一些常见问题的解答也汇总在这里。   言归正传,对我个人而言,我的目标并不是做一个QQ高仿版的玩具,而是希望做成一个能够真正使用的产品(这个过程还有很长的路要走),并持续维护下去。 一.已实现的功能 (01)注册、登录、添加好友、好友列表。 (02)文字聊天、字体设置、表情、窗口震动、截图、手写板 (03)群功能:创建群、加入群、退出群、群聊天 (04)文件传送、文件夹传送(支持断点续传) (05)语音视频聊天 (06)远程磁盘 (07)远程协助 (08)共享桌面(可以指定要共享的桌面区域) (09)可靠的P2P (10)网盘 (11)离线消息 (12)离线文件 (13)最近联系人列表 (14)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时关闭程序还是隐藏窗口。 二.后续待实现的功能 (1)增加持久化支持 (2)视频会议 (3)聊天记录 三.框架选型 如果要完全从头开发GG,其难度可想而知,所以,利用现有的成熟框架是必要的,我们必须站在别人的肩膀上,才能做得好。截至到现在,GG 所采用的框架和素材如下: (1)通信框架:ESFramework (2)语音视频OMCS (3)皮肤框架:SkinForm (4)截屏类库:ImageCapturerLib (5)图片素材:90%以上来自QQ。 开发环境:VS2010 ,开发语言:C#, .NET Framework 版本: 2.0 四.相关说明 1.如果要将GG部署到广域网,则可以在服务端的配置文件中设置监听的端口;而在客户端的配置文件中,则可以指定服务器的IP和Port。 2.虚拟数据库 (1)为了部署测试简单,GG没有采用真实的物理数据库,而是在内存中虚拟了一个数据库(即服务端的VirtualDB类),用于存储用户注册信息、好友关系、群信息等。 (2)GG内置了几个用户:10000、10001、10002、10003、10004,它们的登录密码都是"1"。 (3)GG内置的这几个用户之间都是好友关系。 (4)GG内置了两个群:G001、G002。G001群包含所有内置测试用户,G002群包含10000和10001两个用户。 (5)上述的这些内置信息,在VirtualDB类的构造函数中设定。 3.麦克风、摄像头的选择可在客户端系统设置窗口(SystemSettingForm)中指定。 4.语音视频:也有很多朋友问语音视频设备的工作怎么不正常,或者语音视频不流畅,这个可以直接参考OMCS官方文档:摄像头、麦克风、扬声器、设备测试 、带宽要求。 5.GG的皮肤控件使用的是SkinForm,如果有关于SkinForm的问题,可以直接联系我的好友 威廉乔克斯_汀。 6.特别说明一下:GG项目中,只要是我写的代码,全部都放出来了。拜托喜欢每一个dll都有源码的朋友不要再问我要其它的源码了:) 五.版本记录 2013.08.07 -- V1.0, 登录、好友列表、文字聊天、文件传送、文件夹传送 2013.09.02 -- V1.8, 语音视频聊天 2013.09.23 -- V2.0, 网盘、远程磁盘 2013.11.05 -- V2.4, 远程协助、共享桌面 2014.04.15 -- V3.0, 注册、加好友、加入群、群聊 2014.05.16 -- V3.2, 离线消息、离线文件 2014.05.28 -- V3.4, 系统设置、最近联系人

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值