傲瑞组件开发手册(04) -- 语音视频采集组件 MCapture

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

  MCapture 是傲瑞实用组件之一,可用于采集本地摄像头拍摄到的图像、麦克风输入的声音、声卡播放的声音、以及当前电脑桌面的图像,并提供了混音器功能。

一.MCapture 简介

   MCapture 组件内部的核心技术包括以下5个工具:

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

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

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

(4)声卡采集器:采样位数:固定为16bit。通常的采样频率为:48000,声道数:2。【注:声卡采集目前仅支持windows vista / 7 / 8及以上,不支持xp系统】

(5)混音器:传入麦克风采集器和声卡采集器,便能输出混音后的数据。 【要求声卡采集器的采样率:48000,声道数:为2。】

二.MCapture 结构

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

      

1. 对于各采集器

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

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

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

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

2. 对于混音器IAudioMixter

(1)我们可以通过调用CapturerFactory的CreateAudioMixter方法来创建混音器实例。

(2)当传入CreateAudioMixter方法的麦克风采集器和声卡采集器开始工作后(即它们的Start方法被调用后),IAudioMixter将触发AudioMixed事件以暴露混音后的数据。  

          注:如果CapturerFactory的CreateAudioMixter方法抛出异常,很可能是声卡的采样率不是48000导致的,此时,可以按下图设置一下:

         

三.使用接口详细定义

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;
    }
    /// <summary>
    /// 声卡采集器。 【注意:声卡采集器目前只支持Windows vista/7/8】
    /// </summary>
    public interface ISoundcardCapturer : ICapturer
    {
        /// <summary>
        /// 声道数。
        /// </summary>
        int ChannelCount {get ;}
        /// <summary>
        /// 采样频率。
        /// </summary>
        int SampleRate {get ;} 
        /// <summary>
        /// 当采集到一帧声音数据(50ms)时,触发该事件。
        /// </summary>
        event CbGeneric<byte[]> AudioCaptured;
    }
    /// <summary>
    /// 混音器。采样位数:16bit。
    /// </summary>
    public interface IAudioMixter :IDisposable
    {
        /// <summary>
        /// 输出的混音结果的声道数。
        /// </summary>
        int ChannelCount { get; }

        /// <summary>
        /// 输出的混音结果的采样频率。
        /// </summary>
        int SampleRate { get; }

        /// <summary>
        /// 当完成一帧声音数据的混音(20ms)时,触发该事件。
        /// 采样位数:16bit。
        /// </summary>
        event CbGeneric<byte[]> AudioMixed;
    }

  要特别提醒的是:

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

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

(3)声卡采集器的采集参数不是固定的,可以通过ISoundcardCapturer的属性来获得采集的声道数和频率信息。  

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);       
        /// <summary>
        /// 创建声卡采集器(采样位数:16bit)。
        /// </summary>        
        /// <returns>声卡采集器</returns>
        public static ISoundcardCapturer CreateSoundcardCapturer();           
        /// <summary>
        /// 创建混音器。(将麦克风采集的数据与声卡采集的数据进行混音。)
        /// </summary>
        /// <param name="microphoneCapturer">麦克风采集器</param>
        /// <param name="soundcardCapturer">声卡采集器</param>
        /// <param name="mode">声卡声道选择模式。由于声卡采集的结果通常是双声道的,该参数决定混音时是使用左声道数据?还是使用右声道数据?或者是左右声道数据都使用?</param>
        /// <param name="output2Channel">混音结果是否采用双声道?如果为true,则表示麦克风和声卡的数据在混音结果中各占一个声道。</param>
        /// <returns>混音器</returns>
        public static IAudioMixter CreateAudioMixter(IMicrophoneCapturer microphoneCapturer, ISoundcardCapturer soundcardCapturer, SoundcardMode4Mix mode, bool output2Channel);       
         /// <summary>
        /// 创建混音器。(将麦克风采集的数据与声卡采集的数据进行混音。)
        /// </summary>
        /// <param name="microphoneCapturer">麦克风采集器</param>
        /// <param name="soundcardCapturer">声卡采集器</param>       
        /// <returns>混音器</returns>
        public static IAudioMixter CreateAudioMixter(IMicrophoneCapturer microphoneCapturer, ISoundcardCapturer soundcardCapturer);   
    }

四.MCapture Demo

1. 第一个Demo:各采集器功能展现

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

      

  MCapture Demo 源码:Oraycn.MCaptureDemo.rar

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

2. 第二个Demo:录制声卡

      下面是一个声卡录制的demo,使用MCapture的声卡采集功能和MFile的音频录制功能,即录制声卡播放的声音,demo运行的截图如下所示:

     

     声卡录制Demo源码:Oraycn.RecordSoundCardDemo.rar

3. 第三个Demo: 混音(麦克风和声卡)并录制

      将麦克风采集的声音和声卡采集的声音进行混音,然后录制成mp3文件,demo运行的截图如下所示:

     

     混音录制Demo源码:Oraycn.MixAndRecordDemo.rar

4. 第四个Demo:同时录制(桌面+麦克风+声卡)Demo

      将声卡/麦克风/屏幕的采集与录制集中在一个Demo中:Oraycn.DesktopMixedAudioRecordDemo.rar

5. 第五个Demo:最完整的采集与录制Demo ,提供 Windows Form 版本 和 WPF 版本,五星推荐!!!

      将声卡、麦克风、摄像头、屏幕的采集与录制集中在一个Demo中:

       

      (声卡/麦克风/摄像头/屏幕)采集&录制 Demo :Windows Form 版本 WPF 版本

6. 录制画中画(桌面+摄像头+麦克风/声卡)

      将摄像头的画面叠加在屏幕的画面上,然后结合麦克风(或/和声卡)进行录制的Demo:

      

      画中画录制Demo:Oraycn.RecordPictureCompositionDemo.rar 

 

-----------------------------------------------------------------------------------------------------------------------------------------------   

下载 更多傲瑞组件以及Demo源码 

阅读 更多傲瑞组件开发手册系列文章 

Q Q:168757008 

官网:http://www.oraycn.com/ 

导航

首页

官方网站

立即咨询 

站内搜索

ESFramework 通信框架

详细说明

SDK下载

ESFramework FAQ

版本变更记录

OMCS 语音视频框架

详细说明

SDK下载

OMCS FAQ

版本变更记录

OrayTalk 企业即时通讯系统

详细说明

客户端下载

傲瑞实用组件

SDK下载

NPush 消息推送组件

StriveEngine 轻量级的通信引擎

MFile 语音视频录制组件

MCapture 语音视频采集组件

MPlayer 语音视频播放组件

OAUS 自动升级系统

傲瑞组件 FAQ

授权

授权流程

产品授权说明

产品选购指南

授权SDK使用说明

其它

SDK使用技巧

联系我们

电话:027-87638960

Q Q:168757008

邮件:master@oraycn.com