首页 > 代码库 > 使用C#采集语音视频、屏幕桌面【基于MCapture组件】

使用C#采集语音视频、屏幕桌面【基于MCapture组件】

在多媒体系统中,一般都会涉及到语音、视频、桌面的数据采集问题,采集得到的数据可以用来传输、播放、或存储。所以,对于像课件录制系统、语音视频录制系统、录屏系统等,多媒体数据的采集就是最基础的功能之一。

  MCapture可用于采集本地摄像头拍摄到的图像、麦克风输入的声音、以及当前电脑桌面的图像。

一.MCapture 简介

  MCapture 组件内部的核心技术包括以下3点:

(1)摄像头采集:可指定摄像头的索引、摄像头视频的分辨率、采集的帧频。

(2)麦克风采集:可指定麦克风的索引。默认采样参数为 -- 采样位数:16bit,采样频率:16000,声道数:1。

(3)桌面屏幕采集:可指定采集的帧频、是全屏采集还是采集屏幕的某个矩形区域、是否显示鼠标光标。

 

二.MCapture 结构

  对于使用者而言,MFile组件中的主要类的结构图如下所示:

      

(1)ICameraCapturer是摄像头视频采集组件;IMicrophoneCapturer是麦克风声音采集组件;IDesktopCapturer 是屏幕桌面采集组件。它们都集成自ICapture基础接口。

(2)我们可以通过调用CapturerFactory的CreateXXXX方法来创建对应的采集器实例。

(3)得到采集器实例后,调用Start方法,即可开始采集;调用Stop方法,即停止采集。

(4)采集得到的数据,将通过相应的事件(ImageCaptured、AudioCaptured)暴露出来,我们预定这些事件,即可拿到采集的数据。

 

三.使用接口详细定义

1.各采集器接口

复制代码
    /// <summary>
    /// 傲瑞采集器基础接口。
    /// </summary>
    public interface ICapturer
    {
        /// <summary>
        /// 如果采集的过程中发生错误,将触发此事件。
        /// </summary>
        event CbGeneric<Exception> CaptureError;

        /// <summary>
        /// 开始采集。
        /// </summary>
        void Start();

        /// <summary>
        /// 停止采集。
        /// </summary>
        void Stop();
    }

    /// <summary>
    /// 摄像头采集器。
    /// </summary>
    public interface ICameraCapturer : ICapturer
    {
        /// <summary>
        /// 当采集到一帧图像时,触发该事件。
        /// </summary>
        event CbGeneric<Bitmap> ImageCaptured;
    }

    /// <summary>
    /// 桌面采集器。
    /// </summary>
    public interface IDesktopCapturer : ICapturer
    {
        /// <summary>
        /// 当采集到一帧图像时,触发该事件。
        /// </summary>
        event CbGeneric<Bitmap> ImageCaptured;
        
    }

    /// <summary>
    /// 麦克风采集器。
    /// </summary>
    public interface IMicrophoneCapturer : ICapturer
    {
        /// <summary>
        /// 当采集到一帧声音数据(20ms)时,触发该事件。
        /// </summary>
        event CbGeneric<byte[]> AudioCaptured;
    }
复制代码

  要特别提醒的是:

(1)ICapture接口的CaptureError事件,当采集的过程中出现错误时,将触发此事件,并且,采集过程会终止。

(2)针对视频和桌面采集,ImageCaptured会暴露出采集得到的视频帧(Bitmap),当该视频帧使用完毕后,要立即调用其Dispose方法,以释放其占用的内存(而不要等到GC自动回收)。

 

2.采集器工厂

复制代码
    /// <summary>
    /// 采集器工厂。
    /// </summary>
    public static class CapturerFactory
    {    
        /// <summary>
        /// 创建摄像头采集器。
        /// </summary>
        /// <param name="cameraIndex">摄像头的索引</param>
        /// <param name="videoSize">摄像头的分辨率</param>
        /// <param name="fps">采集的帧频</param>
        /// <returns>摄像头采集器</returns>
        public static ICameraCapturer CreateCameraCapturer(int cameraIndex, Size videoSize, int fps);        /// <summary>
        /// 创建桌面采集器。
        /// </summary>
        /// <param name="fps">采集的帧频。</param>
        /// <param name="showMouseCursor">采集的图像中是否显示鼠标的光标</param>
        /// <returns>桌面采集器</returns>
        public static IDesktopCapturer CreateDesktopCapturer(int fps, bool showMouseCursor);       /// <summary>
        /// 创建桌面采集器。
        /// </summary>
        /// <param name="fps">采集的帧频。</param>
        /// <param name="showMouseCursor">采集的图像中是否显示鼠标的光标</param>
        /// <param name="captureRect">要采集桌面的区域。</param>
        /// <returns>桌面采集器</returns>
        public static IDesktopCapturer CreateDesktopCapturer(int fps, bool showMouseCursor, Rectangle? captureRect);
        /// <summary>
        /// 创建麦克风采集器(采样位数:16bit,采样频率:16000,声道数:1)。
        /// </summary>
        /// <param name="microphoneIndex">麦克风的索引</param>
        /// <returns>麦克风采集器</returns>
        public static IMicrophoneCapturer CreateMicrophoneCapturer(int microphoneIndex);       
    }
复制代码

 

四.MCapture Demo

  下面我们使用一个demo来介绍如何使用MCapture 组件,在这个demo中,我们直接将采集到的视频数据显示在主窗体上,如果是语音数据,则在界面显示采集得到的语音数据的长度。Demo 运行的截图如下所示:      

      

  MCapture Demo 源码:MCaptureDemo.rar

  如果是要录制采集的语音视频或录制屏幕,可以将MCapture与我们的语音视频录制组件MFile相结合,来快速实现这一功能。

使用C#采集语音视频、屏幕桌面【基于MCapture组件】