傲瑞组件开发手册(04) -- 语音视频采集组件 MCapture
在多媒体系统中,一般都会涉及到语音、视频、桌面的数据采集问题,采集得到的数据可以用来传输、播放、或存储。所以,对于像课件录制系统、语音视频录制系统、录屏系统等,多媒体数据的采集就是最基础的功能之一。
MCapture 是傲瑞实用组件之一,可用于采集本地摄像头拍摄到的图像、麦克风输入的声音、声卡播放的声音、以及当前电脑桌面的图像,并提供了混音器功能。
一.MCapture 简介
MCapture 组件内部的核心技术包括以下5个工具:
(1)摄像头采集器:可指定摄像头的索引、摄像头视频的分辨率、采集的帧频。
(2)麦克风采集器:可指定麦克风的索引。默认采样参数为 -- 采样位数:16bit,采样频率:16000,声道数:1。
(3)桌面屏幕采集器:可指定采集的帧频、是全屏采集还是采集屏幕的某个矩形区域、是否显示鼠标光标。
(4)声卡采集器:采样位数:固定为16bit。通常的采样频率为:48000,声道数:1。【注:声卡采集目前仅支持windows vista / 7 / 8及以上,不支持xp系统】
(5)混音器:传入麦克风采集器和声卡采集器,便能输出混音后的数据。
注:这里对声卡采集和混音器补充说明一下。
假设有这样一个需求,网络老师备课时,录制自己讲课的课件,需要将麦克风的声音和电脑播放的背景音乐都录制进去,那么,这就需要用声卡采集来采集电脑播放的背景音乐声音。然后,声卡采集和麦克风采集得到的两路声音必须经过混音器混成一路后,才能录制到文件中。
二.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 : IDisposable { /// <summary> /// 如果采集的过程中发生错误,将触发此事件。 /// </summary> event CbGeneric<Exception> CaptureError; /// <summary> /// 是否正在采集? /// </summary> bool IsCapturing { get; } /// <summary> /// 开始采集。 /// </summary> void Start(); /// <summary> /// 停止采集。 /// </summary> void Stop(); } /// <summary> /// 图像视频采集器。 /// </summary> public interface IVideoCapturer : ICapturer { /// <summary> /// 视频尺寸。 /// </summary> Size VideoSize { get; } /// <summary> /// 帧频。 /// </summary> int Framerate { get; } /// <summary> /// 当采集到一帧图像时,触发该事件。 /// </summary> event CbGeneric<Bitmap> ImageCaptured; } /// <summary> /// 声音采集器。 /// </summary> public interface IAudioCapturer : ICapturer { /// <summary> /// 采集得到声音数据的音量调整系数,取值范围:0 ~ 5.0,默认值1。取值1表示不变,0~1之间表示缩小音量,大于1表示放大音量。 /// </summary> float VolumeAmplifier { get; } /// <summary> /// 声道数。 /// </summary> int ChannelCount { get; } /// <summary> /// 采样频率。 /// </summary> int SampleRate { get; } } /// <summary> /// 摄像头采集器。 /// </summary> public interface ICameraCapturer : IVideoCapturer { } /// <summary> /// 桌面采集器。 /// </summary> public interface IDesktopCapturer : IVideoCapturer { /// <summary> /// 如果要缩放采集的图片,则该属性用于设置缩放后的大小。设置为null,表示不缩放。默认值为null。 /// </summary> Size? ZoomSize { get; set; } } /// <summary> /// 麦克风采集器。 /// </summary> public interface IMicrophoneCapturer : IAudioCapturer { /// <summary> /// 当采集到一帧声音数据(20ms)时,触发该事件。 /// </summary> event CbGeneric<byte[]> AudioCaptured; } /// <summary> /// 声卡采集器(采样位数:16bit)。 /// </summary> public interface ISoundcardCapturer : IAudioCapturer { /// <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> /// <returns>混音器</returns> public static IAudioMixter CreateAudioMixter(IMicrophoneCapturer microphoneCapturer, ISoundcardCapturer soundcardCapturer);/// <summary> /// 创建混音器。 /// </summary> /// <param name="capturer1">采集器1。采样率16000,位数:16。</param> /// <param name="capturer2">采集器2。采样率16000,位数:16。</param> /// <returns>混音器</returns> public static IAudioMixter CreateAudioMixter(IWaveCapturer capturer1, IWaveCapturer capturer2);}
四.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
7. 图像合成
该Demo将演示如何将采集到的两个摄像头的图像,合成到一幅图像中。
视频图像合成Demo:Oraycn.MCaptureDemo_MergeVideo.rar
-----------------------------------------------------------------------------------------------------------------------------------------------
Q Q:168757008