在多媒体系统中,通常都会涉及到录音、录像、录屏问题,采集获得的数据能够用来传输、播放、或存储。因此,对于像课件录制系统、语音视频录制系统、录屏系统等,多媒体数据的采集就是最基础的功能之一。服务器
MCapture可用于采集本地摄像头拍摄到的图像、麦克风输入的声音、以及当前电脑桌面的图像。ide
一.MCapture 简介
MCapture 组件录音、录像、录屏内部的核心技术包括如下3点:.net
(1)摄像头采集:可指定摄像头的索引、摄像头视频的分辨率、采集的帧频。orm
(2)麦克风采集:可指定麦克风的索引。默认采样参数为 -- 采样位数:16bit,采样频率:16000,声道数:1。视频
(3)桌面屏幕采集:可指定采集的帧频、是全屏采集仍是采集屏幕的某个矩形区域、是否显示鼠标光标。blog
二.C#录音组件、录像组件、录屏组件——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);
}
四.录音、录像、录屏源码
下面咱们使用一个demo来介绍如何使用MCapture 组件,在这个demo中,咱们直接将采集到的视频数据显示在主窗体上,若是是语音数据,则在界面显示采集获得的语音数据的长度。Demo 运行的截图以下所示:
MCapture Demo 源码:MCaptureDemo.rar
若是是要实现录音、录像、录屏,能够将MCapture与咱们的语音视频录制组件MFile相结合,来快速实现这一功能。
2015.6.18 整理所有相关开源源码以下:
(声卡/麦克风/摄像头/屏幕)采集&录制源码源码:WinForm版本 、WPF版本。
声卡录制源码、 混音&录制源码、 同时录制(桌面+麦克风+声卡)源码、 麦克风摄像头录制(可预览)
录制画中画(桌面+摄像头+麦克风/声卡)。
远程录制或在服务器端录制语音视频屏幕