在多媒體系統中,一般都會涉及到錄音、錄像、錄屏問題,採集得到的數據可以用來傳輸、播放、或存儲。所以,對於像課件錄製系統、語音視頻錄製系統、錄屏系統等,多媒體數據的採集就是最基礎的功能之一。
MCapture可用於採集本地攝像頭拍攝到的圖像、麥克風輸入的聲音、以及當前電腦桌面的圖像。
一.MCapture 簡介
MCapture 組件錄音、錄像、錄屏內部的核心技術包括以下3點:
(1)攝像頭採集:可指定攝像頭的索引、攝像頭視頻的分辨率、採集的幀頻。
(2)麥克風採集:可指定麥克風的索引。默認採樣參數爲 -- 採樣位數:16bit,採樣頻率:16000,聲道數:1。
(3)桌面屏幕採集:可指定採集的幀頻、是全屏採集還是採集屏幕的某個矩形區域、是否顯示鼠標光標。
二.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版本。
聲卡錄製源碼、 混音&錄製源碼、 同時錄製(桌面+麥克風+聲卡)源碼、 麥克風攝像頭錄製(可預覽)
版權聲明:本文爲博主原創文章,未經博主允許不得轉載。