C#实现国产Linux视频录制生成mp4(附源码,银河麒麟、统信UOS)
随着信创国产化浪潮的来临,在国产操作系统上的应用开发的需求越来越多,最近有个客户需要在银河麒麟或统信 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;
<span class="hljs-keyword">this</span>.microphoneCapturer.Start();
<span class="hljs-keyword">this</span>.cameraCapturer.Start();</code></pre>
创建并启动录制器:
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);
}
}
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">MicrophoneCapturer_AudioCaptured</span>(<span class="hljs-params"><span class="hljs-built_in">byte</span>[] obj</span>)</span>
{
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.isRecording)
{
<span class="hljs-keyword">this</span>.videoFileMaker.AddAudioFrame(obj);
}
}</code></pre>
停止录制:
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 架构的,如果需要在其它架构的国产芯片上运行该程序,可以联系我获取对应架构的非托管库。