隨著信創國產化浪潮的來臨,在國產作業系統上的應用開發的需求越來越多,最近有個客戶需要在銀河麒麟或統信UOS上實現錄製攝像頭影片和麥克風聲音,將它們錄製成一個mp4檔案。那麼這樣的功能要如何實現了?
一. 技術方案
要完成這些功能,具體來說,需要解決如下幾個技術問題:
(1)麥克風資料採集。
(2)攝像頭資料採集。
(3)音訊資料編碼。
(4)影片資料編碼。
(5)將編碼後的資料按.mp4檔案格式寫入到檔案容器中。
(6)保證音訊影片播放的同步。
我們使用跨平臺的 C# .NET Core ,跨平臺的UI框架Avalonia,再借助 Oraycn.LinuxCapture 和 Oraycn.MFile.NetCore 這兩個元件,就很容易採集到麥克風和攝像頭的資料,並且將它們編碼寫入到mp4檔案中。
我們先看看錄製程式在銀河麒麟上的執行效果:
兩個下拉選單可以選擇要使用的麥克風和攝像頭裝置。
點選“開始”按鈕,麥克風和攝像頭將開始採集資料,並錄製生成mp4檔案(在執行目錄下)。
點選“結束”按鈕,則將完成錄製,此時可以開啟生成的mp4檔案進行播放。
二.具體實現
(1)ICameraCapturer是攝像頭影片採集元件;IMicrophoneCapturer是麥克風聲音採集元件。
(2)我們可以透過呼叫CapturerFactory的CreateXXXX方法來建立對應的採集器例項。
(3)得到採集器例項後,呼叫Start方法,即可開始採集;呼叫Stop方法,即停止採集。
(4)採集得到的資料,將透過相應的事件(ImageCaptured、AudioCaptured)暴露出來,我們預定這些事件,即可拿到採集的資料。
(5)將拿到的資料餵給VideoFileMaker,VideoFileMaker就會將其編碼並寫入到mp4檔案中。
我們這裡列一下核心程式碼,完整的程式碼大家可以從文末下載原始碼進行了解。
建立並啟動採集器:
//攝像頭採集器
this.cameraCapturer = CapturerFactory.CreateCameraCapturer(cameraIndex, videoSize, frameRate);
this.cameraCapturer.ImageCaptured += CameraCapturer_ImageCaptured;
this.cameraCapturer.CaptureError += CameraCapturer_CaptureError;
//麥克風採集器
this.microphoneCapturer = CapturerFactory.CreateMicrophoneCapturer(micIndex);
this.microphoneCapturer.AudioCaptured += MicrophoneCapturer_AudioCaptured;
this.microphoneCapturer.CaptureError += MicrophoneCapturer_CaptureError;
this.microphoneCapturer.Start();
this.cameraCapturer.Start();
建立並啟動錄製器:
this.videoFileMaker = new VideoFileMaker();
this.videoFileMaker.Initialize("test.mp4", VideoCodecType.H264, videoSize.Width, videoSize.Height, frameRate, VideoQuality.High, AudioCodecType.AAC, audioSampleRate, channelCount, true);
將採集到的資料餵給錄製器:
private void CameraCapturer_ImageCaptured(byte[] obj)
{
if (this.isRecording)
{
this.videoFileMaker.AddVideoFrame(obj);
}
}
private void MicrophoneCapturer_AudioCaptured(byte[] obj)
{
if (this.isRecording)
{
this.videoFileMaker.AddAudioFrame(obj);
}
}
停止錄製:
private void FinishRecorded(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
{
this.RecordState_Changed(false);
this.cameraCapturer?.Stop();
this.cameraCapturer?.Dispose();
this.microphoneCapturer?.Stop();
this.microphoneCapturer?.Dispose();
this.videoFileMaker?.Close(true);
MessageBox.Show("錄製完成!", this);
}
三. 部署執行
如果要在銀河麒麟或統信UOS上執行這裡的錄製程式,則需要現在目標作業系統上安裝.NET Core 3.1。
然後將VS生成目錄下的 netcoreapp3.1 資料夾複製到目標電腦上,進入netcoreapp3.1資料夾,開啟終端,並在終端中輸入如下命令:
dotnet Oraycn_Avalonias_RecordDemo.Desktop.dll
回車執行後,就會出現前面截圖的UI介面,然後我們就可以錄製麥克風攝像頭了。
四. 原始碼下載
Oraycn.Avalonias.RecordDemo.rar
原始碼中包含的非託管庫是X64架構的,如果需要在其它架構的國產晶片上執行該程式,可以聯絡我獲取對應架構的非託管庫。