1. 程式人生 > >C#實現語音視訊錄製 【基於MCapture + MFile】

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 += new
CbGeneric<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原始碼下載