使用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相结合,来快速实现这一功能。

时间: 2024-08-28 18:45:44

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

C#实现语音视频录制 【基于MCapture + MFile】

在上一篇使用C#采集语音视频.屏幕桌面[基于MCapture组件]的文章中,我们已经可以采集到语音.视频.桌面数据了,那么,接下来我们再结合MFile的录制功能,便能把这些数据写到文件中,生成标准的mp4文件. 使用MCapture+MFile,我们可以实现以下类似的应用: (1)录制课件:录制屏幕桌面+语音. (2)录制自己的MV:录制摄像头视频+语音. (3)录制教学视频:录制桌面+自己的视频+语音.(其中将桌面与自己视频叠加在一起) 那接下来这篇文章将详细介绍应用(2)的实现,我们做一个简

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

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

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

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

OMCS ——卓尔不群的网络语音视频框架

作为.NET平台上的开发人员,要开发出一个像样视频聊天系统或视频会议系统,非常艰难,这不仅仅是因为.NET对多媒体的支持比较有限,还因为网络语音视频这块涉及到了很多专业方面的技术,而.NET在这些方面的沉淀更是稀少.OMCS的出现将使得这一状况完全改观,它把所有底层的.复杂的.繁琐的细节都封装在了内部,提供给您一个易用而又强大的接口. OMCS网络语音视频框架是集成了语音.视频.远程桌面.电子白板等多种媒体于一身的网络多媒体框架,实现了多媒体设备[麦克风.摄像头.桌面.电子白板]的采集.编码.网

开源语音视频聊天软件对比

谷歌在2011年推出了开源的语音视频聊天软件WebRTC,并准备将这款功能类似Skype.Facetime的软件集成到Chrome浏览器中. 目前,互联网的音频.视频通信服务技术一般都是私有技术,需要通过安装插件或桌面客户端来实现通信功能.但谷歌希望能够直接在浏览器中创建视频或语音聊天应用,这也是谷歌此次将WebRTC开源出来的原因.这很可能是未来语音和视频领域的Web应用趋势.下面介绍在全球品牌谷歌的WebRTC音视频和国内先进技术的AnyChat音视频平台进行对比分析: 关于WebRTC W

在服务器端录制语音视频

在我以前的一篇博文<实现语音视频录制(demo源码)>中,详细介绍了在网络视频聊天系统中的客户端如何实现语音视频的录制,而近段时间了,有几个朋友问起,如果想在服务端实现录制功能,该怎么做了?其中有个朋友的需求是这样的:他的系统是一个在线培训系统,需要在服务端将指定老师的讲课(包括语音和视频)录制下来,并保存为.mp4文件,以便随时可以查阅这些文件. 本文我们就做一个demo实现类似的功能,演示如何在服务端录制某个指定在线用户的语音视频,并提供三种录制模式:录制语音视频.仅录制语音.仅录制视频.

公司局域网实现语音视频聊天

随着全球信息化进程的不断发展,越来越多的企业使用局域网来管理各种事务.但随着局域网的机器增多,软件的应用对局域网的信息吞吐.处理能力的要求也越高.为解决上述矛盾,就有必要设计一个在局域网里的ICQ,国内拥有领先音视频通讯技术的佰锐科技十年专注于"AnyChat"音视频开发平台,通过采用先进的H.264视频编解码技术和AAC音频编解码技术,改善P2P数据传输技术.通过该系统,进行文件传输,消息的发布,提高企业的工作效率. AnyChat音视频开系统基于TCP/IP网络协议,采用C/S模式

OpenCV采集的视频流转化成H264格式裸码流

本文通过OpenCV库采集摄像头视频,随后通过libx264库把帧转化成264格式的码流. 头文件: #ifndef _X264_ENCODER_H #define _X264_ENCODER_H #include <stdint.h> #include "x264.h" #include "opencv/cv.h" #include "opencv/highgui.h" struct x264_encoder{ x264_param

Android摄像头采集的视频数据流如何通过Socket实时发送到目标服务端

分两块: 1.取得摄像头采集的视频流 2.发送到服务器端 protected MediaRecorder mMediaRecorder; private LocalServerSocket mLss = null; private LocalSocket mReceiver, mSender = null; mLss = new LocalServerSocket("myVideoStream"); mReceiver = new LocalSocket(); //连接mLss,即接受