C#將國產(chǎn)Linux視頻錄制生成mp4的具體實現(xiàn)
一.技術(shù)方案
要完成這些功能,具體來說,需要解決如下幾個技術(shù)問題:
(1)麥克風(fēng)數(shù)據(jù)采集。
(2)攝像頭數(shù)據(jù)采集。
(3)音頻數(shù)據(jù)編碼。
(4)視頻數(shù)據(jù)編碼。
(5)將編碼后的數(shù)據(jù)按.mp4文件格式寫入到文件容器中。
(6)保證音頻視頻播放的同步。
我們使用跨平臺的 C# .NET Core ,跨平臺的UI框架Avalonia,再借助 Oraycn.LinuxCapture 和 Oraycn.MFile.NetCore 這兩個組件,就很容易采集到麥克風(fēng)和攝像頭的數(shù)據(jù),并且將它們編碼寫入到mp4文件中。
我們先看看錄制程序在銀河麒麟上的運行效果:

兩個下拉列表可以選擇要使用的麥克風(fēng)和攝像頭設(shè)備。
點擊“開始”按鈕,麥克風(fēng)和攝像頭將開始采集數(shù)據(jù),并錄制生成mp4文件(在運行目錄下)。
點擊“結(jié)束”按鈕,則將完成錄制,此時可以打開生成的mp4文件進行播放。
二.具體實現(xiàn)
(1)ICameraCapturer是攝像頭視頻采集組件;IMicrophoneCapturer是麥克風(fēng)聲音采集組件。
(2)我們可以通過調(diào)用CapturerFactory的CreateXXXX方法來創(chuàng)建對應(yīng)的采集器實例。
(3)得到采集器實例后,調(diào)用Start方法,即可開始采集;調(diào)用Stop方法,即停止采集。
(4)采集得到的數(shù)據(jù),將通過相應(yīng)的事件(ImageCaptured、AudioCaptured)暴露出來,我們預(yù)定這些事件,即可拿到采集的數(shù)據(jù)。
(5)將拿到的數(shù)據(jù)喂給VideoFileMaker,VideoFileMaker就會將其編碼并寫入到mp4文件中。
我們這里列一下核心代碼,完整的代碼大家可以從文末下載源碼進行了解。
創(chuàng)建并啟動采集器:
//攝像頭采集器
this.cameraCapturer = CapturerFactory.CreateCameraCapturer(cameraIndex, videoSize, frameRate);
this.cameraCapturer.ImageCaptured += CameraCapturer_ImageCaptured;
this.cameraCapturer.CaptureError += CameraCapturer_CaptureError;
//麥克風(fēng)采集器
this.microphoneCapturer = CapturerFactory.CreateMicrophoneCapturer(micIndex);
this.microphoneCapturer.AudioCaptured += MicrophoneCapturer_AudioCaptured;
this.microphoneCapturer.CaptureError += MicrophoneCapturer_CaptureError;
this.microphoneCapturer.Start();
this.cameraCapturer.Start();創(chuàng)建并啟動錄制器:
this.videoFileMaker = new VideoFileMaker();
this.videoFileMaker.Initialize("test.mp4", VideoCodecType.H264, videoSize.Width, videoSize.Height, frameRate, VideoQuality.High, AudioCodecType.AAC, audioSampleRate, channelCount, true);將采集到的數(shù)據(jù)喂給錄制器:
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);
}三.部署運行
如果要在銀河麒麟或統(tǒng)信UOS上運行這里的錄制程序,則需要現(xiàn)在目標(biāo)操作系統(tǒng)上安裝.NET Core 3.1。
然后將VS生成目錄下的 netcoreapp3.1 文件夾拷貝到目標(biāo)電腦上,進入netcoreapp3.1文件夾,打開終端,并在終端中輸入如下命令:
dotnet Oraycn_Avalonias_RecordDemo.Desktop.dll
回車運行后,就會出現(xiàn)前面截圖的UI界面,然后我們就可以錄制麥克風(fēng)攝像頭了。
到此這篇關(guān)于C#將國產(chǎn)Linux視頻錄制生成mp4的具體實現(xiàn)的文章就介紹到這了,更多相關(guān)C# Linux視頻生成mp4內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Extjs4如何處理后臺json數(shù)據(jù)中日期和時間
本文給大家分享Extjs4如何處理后臺json數(shù)據(jù)中日期和時間,通過代碼示例給大家剖析,感興趣的朋友快來圍觀2015-08-08
c#實現(xiàn)幾種數(shù)據(jù)庫的大數(shù)據(jù)批量插入
這篇文章主要介紹了c#實現(xiàn)幾種數(shù)據(jù)庫的大數(shù)據(jù)批量插入,主要包括SqlServer、Oracle、SQLite和MySQL,有興趣的可以了解一下。2017-01-01
使用C#實現(xiàn)設(shè)置 Excel單元格格式的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何通過使用C#在同一個工作表中設(shè)置 字體、背景顏色、行高列寬、邊框和單元格合并,文中的示例代碼講解詳細(xì),需要的小伙伴可以了解下2025-09-09
C#多線程學(xué)習(xí)之(五)使用定時器進行多線程的自動管理
這篇文章主要介紹了C#多線程學(xué)習(xí)之使用定時器進行多線程的自動管理,實例分析了C#使用timer定時器類實現(xiàn)針對多線程的自動管理功能,非常具有實用價值,需要的朋友可以參考下2015-04-04

