C#將國(guó)產(chǎn)Linux視頻錄制生成mp4的具體實(shí)現(xiàn)
一.技術(shù)方案
要完成這些功能,具體來(lái)說(shuō),需要解決如下幾個(gè)技術(shù)問(wèn)題:
(1)麥克風(fēng)數(shù)據(jù)采集。
(2)攝像頭數(shù)據(jù)采集。
(3)音頻數(shù)據(jù)編碼。
(4)視頻數(shù)據(jù)編碼。
(5)將編碼后的數(shù)據(jù)按.mp4文件格式寫(xiě)入到文件容器中。
(6)保證音頻視頻播放的同步。
我們使用跨平臺(tái)的 C# .NET Core ,跨平臺(tái)的UI框架Avalonia,再借助 Oraycn.LinuxCapture 和 Oraycn.MFile.NetCore 這兩個(gè)組件,就很容易采集到麥克風(fēng)和攝像頭的數(shù)據(jù),并且將它們編碼寫(xiě)入到mp4文件中。
我們先看看錄制程序在銀河麒麟上的運(yùn)行效果:
兩個(gè)下拉列表可以選擇要使用的麥克風(fēng)和攝像頭設(shè)備。
點(diǎn)擊“開(kāi)始”按鈕,麥克風(fēng)和攝像頭將開(kāi)始采集數(shù)據(jù),并錄制生成mp4文件(在運(yùn)行目錄下)。
點(diǎn)擊“結(jié)束”按鈕,則將完成錄制,此時(shí)可以打開(kāi)生成的mp4文件進(jìn)行播放。
二.具體實(shí)現(xiàn)
(1)ICameraCapturer是攝像頭視頻采集組件;IMicrophoneCapturer是麥克風(fēng)聲音采集組件。
(2)我們可以通過(guò)調(diào)用CapturerFactory的CreateXXXX方法來(lái)創(chuàng)建對(duì)應(yīng)的采集器實(shí)例。
(3)得到采集器實(shí)例后,調(diào)用Start方法,即可開(kāi)始采集;調(diào)用Stop方法,即停止采集。
(4)采集得到的數(shù)據(jù),將通過(guò)相應(yīng)的事件(ImageCaptured、AudioCaptured)暴露出來(lái),我們預(yù)定這些事件,即可拿到采集的數(shù)據(jù)。
(5)將拿到的數(shù)據(jù)喂給VideoFileMaker,VideoFileMaker就會(huì)將其編碼并寫(xiě)入到mp4文件中。
我們這里列一下核心代碼,完整的代碼大家可以從文末下載源碼進(jìn)行了解。
創(chuàng)建并啟動(dò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)建并啟動(dò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); }
三.部署運(yùn)行
如果要在銀河麒麟或統(tǒng)信UOS上運(yùn)行這里的錄制程序,則需要現(xiàn)在目標(biāo)操作系統(tǒng)上安裝.NET Core 3.1。
然后將VS生成目錄下的 netcoreapp3.1 文件夾拷貝到目標(biāo)電腦上,進(jìn)入netcoreapp3.1文件夾,打開(kāi)終端,并在終端中輸入如下命令:
dotnet Oraycn_Avalonias_RecordDemo.Desktop.dll
回車(chē)運(yùn)行后,就會(huì)出現(xiàn)前面截圖的UI界面,然后我們就可以錄制麥克風(fēng)攝像頭了。
到此這篇關(guān)于C#將國(guó)產(chǎn)Linux視頻錄制生成mp4的具體實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# Linux視頻生成mp4內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#動(dòng)態(tài)查詢(xún)之巧用Expression組合多條件表達(dá)式的方法和步驟
在C#中,可以使用AndAlso和OrElse方法組合兩個(gè)Expression<Func<T, bool>>類(lèi)型的表達(dá)式,下面通過(guò)實(shí)例代碼給大家分享C#動(dòng)態(tài)查詢(xún)之巧用Expression組合多條件表達(dá)式,感興趣的朋友跟隨小編一起看看吧2024-05-05C# OpenCvSharp實(shí)現(xiàn)圖片批量改名
這篇文章主要為大家詳細(xì)介紹了C#如何結(jié)合OpenCvSharp實(shí)現(xiàn)圖片批量改名功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03C#中使用Override和New關(guān)鍵字進(jìn)行版本控制
在?C#?中,override?和?new?關(guān)鍵字用于控制類(lèi)之間的成員方法的隱藏和重寫(xiě),理解它們之間的差異和使用場(chǎng)景對(duì)于設(shè)計(jì)靈活且易于維護(hù)的代碼至關(guān)重要,在這篇博客中,我們將詳細(xì)探討這兩個(gè)關(guān)鍵字的用法,并通過(guò)示例來(lái)說(shuō)明它們的實(shí)際應(yīng)用,需要的朋友可以參考下2024-10-10C#使用iTextSharp將PDF轉(zhuǎn)成文本的方法
這篇文章主要介紹了C#使用iTextSharp將PDF轉(zhuǎn)成文本的方法,涉及C#操作pdf文件的相關(guān)技巧,需要的朋友可以參考下2015-05-05C#使用Windows Service的簡(jiǎn)單教程(創(chuàng)建、安裝、卸載、調(diào)試)
這篇文章主要為大家詳細(xì)介紹了C#創(chuàng)建、安裝、卸載、調(diào)試Windows Service(Windows 服務(wù))的簡(jiǎn)單教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01C# ODP.NET 調(diào)用Oracle函數(shù)返回值時(shí)報(bào)錯(cuò)的一個(gè)解決方案
這篇文章主要介紹了C# ODP.NET 調(diào)用Oracle函數(shù)返回值時(shí)報(bào)錯(cuò)的一個(gè)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12