C#實現語音視訊錄製 【基於MCapture + MFile】
在上一篇使用C#採集語音視訊、螢幕桌面【基於MCapture元件】的文章中,我們已經可以採集到語音、視訊、桌面資料了,那麼,接下來我們再結合MFile的錄製功能,便能把這些資料寫到檔案中,生成標準的mp4檔案。
使用MCapture+MFile,我們可以實現以下類似的應用:
(1)錄製課件:錄製螢幕桌面+語音。
(2)錄製自己的MV:錄製攝像頭視訊+語音。
(3)錄製教學視訊:錄製桌面+自己的視訊+語音。(其中將桌面與自己視訊疊加在一起)
那接下來這篇文章將詳細介紹應用(2)的實現,我們做一個簡單的Demo(文末有原始碼下載)。另外兩種應用都可以在本文Demo的基礎上作一些修改即可。Demo 執行的截圖如下所示:
首先,當點選啟動裝置按鈕時,我們建立一個攝像頭採集器例項和一個麥克風採集器例項,並啟動它們開始採集:
this.cameraCapturer = CapturerFactory.CreateCameraCapturer(0, new Size(int.Parse(this.textBox_width.Text), int.Parse(this.textBox_height.Text)), this.fps); this.cameraCapturer.ImageCaptured += new CbGeneric<Bitmap>(cameraCapturer_ImageCaptured);this.cameraCapturer.CaptureError += new CbGeneric<Exception>(cameraCapturer_CaptureError); this.microphoneCapturer = CapturerFactory.CreateMicrophoneCapturer(0); this.microphoneCapturer.AudioCaptured += new CbGeneric<byte[]>(microphoneCapturer_AudioCaptured); this.microphoneCapturer.CaptureError += newCbGeneric<Exception>(microphoneCapturer_CaptureError); //開始採集 this.cameraCapturer.Start(); this.microphoneCapturer.Start();
接下來,點選開始錄製按鈕時,我們初始化VideoFileMaker元件:
this.videoFileMaker = new VideoFileMaker(); this.videoFileMaker.AutoDisposeVideoFrame = true; this.videoFileMaker.Initialize("test.mp4", VideoCodecType.H264, int.Parse(this.textBox_width.Text), int.Parse(this.textBox_height.Text), this.fps, AudioCodecType.AAC, 16000, 1, true);
this.isRecording = true;
引數中設定,使用h.264對視訊進行編碼,使用aac對音訊進行編碼,並生成mp4格式的檔案。然後,我們可以通過OMCS獲取實時的音訊資料和視訊資料,並將它們寫到檔案中。
void microphoneCapturer_AudioCaptured(byte[] audioData) //採集到的語音資料 { if (this.isRecording) { this.videoFileMaker.AddAudioFrame(audioData); } } //採集到的視訊影象 void cameraCapturer_ImageCaptured(Bitmap img) { if (this.isRecording) { this.DisplayVideo((Bitmap)img.Clone()); this.videoFileMaker.AddVideoFrame(img); } else { this.DisplayVideo(img); } }
當想結束錄製時,則呼叫Close方法:
this.videoFileMaker.Close(true);
更多細節大家可以下載文末的原始碼研究,最後,有幾點需要額外強調一下的:
(1)攝像頭採集的幀頻最好與錄製所設定的幀頻完全一致。demo中是使用成員變數fps來表示的。
(2)videoFileMaker的AutoDisposeVideoFrame屬性要設定為ture,即儘快釋放不再使用的視訊幀,節省記憶體。
(3)DisplayVideo方法使用的是採集視訊幀的複製品,這是因為videoFileMaker不是同步寫入的,而是先將幀放入佇列,然後非同步寫入的。
(4)DisplayVideo方法在使用完作為背景的視訊幀後,也要儘快釋放。道理同上。
Demo原始碼下載。