C# 实现国产 Linux(银河麒麟、UOS)桌面录制并保存为 MP4

前言

信创国产化已是大势所趋,在国产操作系统上的应用开发的需求越来越多,比如,有客户需要在银河麒麟和统信UOS上实现录制桌面生成一个mp4文件。那么这个要如何实现了?

一、技术方案

要完成这些功能,具体来说,需要解决如下几个技术问题:

1、桌面图像数据采集。

2、视频数据编码(H264)。

3、将编码后的数据按.mp4文件格式写入到文件容器中。

我们使用跨平台的 .NET Core (C#),跨平台的UI框架CPF.NET,再借助 Oraycn.LinuxCapture 和 Oraycn.MFile.NetCore 这两个组件,就很容易采集国产操作系统的桌面图像数据,并且将它们编码写入到mp4文件中。

我们先看看桌面录制程序在银河麒麟上的运行效果:

点击"启动设备"按钮,将启动桌面图像采集线程,以30fps的帧率采集桌面图像。

点击"开始录制"按钮,会初始化录制组件,然后将采集到的桌面图像录制生成mp4文件(在运行目录下)。

点击"结束录制"按钮,则将完成录制,此时可以打开生成的mp4文件进行播放。

二、具体实现

1、IDesktopCapturer是桌面图像采集组件。

2、我们可以通过调用CapturerFactory的CreateDesktopCapturer方法来创建采集器实例。

3、得到采集器实例后,调用Start方法,即可开始采集;调用Stop方法,即停止采集。

4、采集得到的数据,将通过相应的事件(ImageCaptured)暴露出来,我们预定这些事件,即可拿到采集的数据。

5、将拿到的数据喂给VideoFileMaker,VideoFileMaker就会将其编码并写入到mp4文件中。

我们这里列一下核心代码,完整的代码大家可以从文末下载源码进行了解。

创建并启动采集器:

c# 复制代码
 private void OpenDevice()
 { 
     this.desktopCapturer = CapturerFactory.CreateDesktopCapturer(frameRate);
     this.desktopCapturer.ImageCaptured += DesktopCapturer_ImageCaptured;
     videoSize = this.desktopCapturer.VideoSize;
     this.desktopCapturer.Start();
 }

创建并启动录制器:

c# 复制代码
private void StartRecord()
{
    string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + ESBasic.Helpers.FileHelper.GetFilePathSeparatorChar().ToString(); 
    this.silenceVideoFileMaker = new SilenceVideoFileMaker();
    this.silenceVideoFileMaker.Initialize(desktopPath+"test.mp4", VideoCodecType.H264, videoSize.Width, videoSize.Height, frameRate, VideoQuality.Middle);
    this.recording = true;
    this.tip.Visibility = Visibility.Visible;
}

将采集到的数据喂给录制器:

c# 复制代码
private void DesktopCapturer_ImageCaptured(byte[] obj)
{ 
    if(this.recording)
    {
        this.silenceVideoFileMaker.AddVideoFrame(obj);
    }
}

停止录制:

c# 复制代码
private void StopRecord()
{
    this.recording = false;
    this.silenceVideoFileMaker.Close(true);
    this.startRecordBtn.IsHitTestVisible = true;
    this.tip.Visibility = Visibility.Collapsed;
}

三、部署运行

如果要在银河麒麟或统信UOS上运行这里的录制程序,则需要先在目标操作系统上安装.NET Core 3.1。

然后将VS生成目录下的 netcoreapp3.1 文件夹拷贝到目标电脑上,进入netcoreapp3.1文件夹,打开终端,并在终端中输入如下命令:

bash 复制代码
dotnet Oraycn.CPF.RecordDemo.dll

回车运行后,就会出现前面截图的UI界面,然后我们就可以录制桌面图像了。

四、源码下载

www.oraycn.com/DownLoadFil...

源码中包含的非托管库是X64架构的,如果需要在其它架构的国产芯片上运行该程序,可以联系我获取对应架构的非托管库。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:Linux音视频开发

出处:cnblogs.com/shawshank/p/18427307

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!

相关推荐
李宥小哥2 小时前
C#基础11-常用类
android·java·c#
@小博的博客3 小时前
【Linux探索学习】第二篇Linux的基本指令(2)——开启Linux学习第二篇
linux·运维·学习
偶尔的鼠标人4 小时前
Avalonia中,使用DataTable类型作为DataGrid的ItemSource 数据源
ui·c#·avalonia
openHiTLS密码开源社区5 小时前
【密码学实战】openHiTLS passwd命令行:专业密码哈希生成工具
linux·密码学·哈希算法·ldap·密码策略·随机盐值
你的人类朋友5 小时前
先用js快速开发,后续引入ts是否是一个好的实践?
前端·javascript·后端
WTCLLB5 小时前
netgear r6220 路由器,刷openwrt后,系统备份还原
linux·网络·智能路由器·openwrt
R-G-B5 小时前
【02】大恒相机SDK C#开发 —— 初始化相机,采集第一帧图像
c#·大恒相机sdk·大恒相机初始化·大恒相机采集图像
码事漫谈6 小时前
医疗设备控制系统中同步与异步通信的架构设计
后端
码事漫谈6 小时前
C++ 中 rfind 方法详解
后端
迎風吹頭髮6 小时前
UNIX下C语言编程与实践38-UNIX 信号操作:signal 函数与信号捕获函数的编写
linux·c语言·unix