C#实现信创国产Linux桌面录制成MP4(源码,银河麒麟、统信UOS)
信创国产化已是大势所趋,在国产操作系统上的应用开发的需求越来越多,比如,有客户需要在银河麒麟和统信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文件中。
我们这里列一下核心代码,完整的代码大家可以从文末下载源码进行了解。
创建并启动采集器:
private void OpenDevice()
{
this.desktopCapturer = CapturerFactory.CreateDesktopCapturer(frameRate);
this.desktopCapturer.ImageCaptured += DesktopCapturer_ImageCaptured;
videoSize = this.desktopCapturer.VideoSize;
this.desktopCapturer.Start();
}
创建并启动录制器:
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;
}
将采集到的数据喂给录制器:
private void DesktopCapturer_ImageCaptured(byte[] obj)
{
if(this.recording)
{
this.silenceVideoFileMaker.AddVideoFrame(obj);
}
}
停止录制:
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文件夹,打开终端,并在终端中输入如下命令:
dotnet Oraycn.CPF.RecordDemo.dll
回车运行后,就会出现前面截图的UI界面,然后我们就可以录制桌面图像了。
四. 源码下载
源码中包含的非托管库是X64架构的,如果需要在其它架构的国产芯片上运行该程序,可以联系我获取对应架构的非托管库。
C#实现信创国产Linux桌面录制成MP4(源码,银河麒麟、统信UOS)的更多相关文章
- Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装
原文:Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装 Linux内核分析(一) 从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底 ...
- Android4.3 屏蔽HOME按键返回桌面详解(源码环境下)
点击打开链接 首先声明我是做系统开发的(高通平台),所以下面介绍的方法并不适合应用开发者. 最经有个需求要屏蔽HOME按键返回桌面并且实现自己的功能,发现以前的方式报错用不了,上网搜索了一下,发现都是 ...
- Linux 系统下用源码包安装软件
Linux系统下用源码包安装软件 by:授客 QQ:1033553122 下载源码安装包,解压或者直接双击打开(如果有安装zip或rar等压缩/解压缩软件的话),查找相关的安装说明文件,一般是READ ...
- TongWEB与JOnAS 对比,国产中间件战斗机东方通TongWEB源码解析
转自网址: http://bbs.51cto.com/thread-489819-1-1.html 首先需要声明的是,本人出于技术爱好的角度,以下的文字只是对所看到的一些情况的罗列,偶尔附加个人的一些 ...
- 转载~Linux 平台下阅读源码的工具
Linux 平台下阅读源码的工具 前言 看源代码是一个程序员必须经历的事情,也是可以提升能力的一个捷径.个人认为: 要完全掌握一个软件的方法只有阅读源码在Windows下有sourceinsight这 ...
- linux线程池thrmgr源码解析
linux线程池thrmgr源码解析 1 thrmgr线程池的作用 thrmgr线程池的作用是提高程序的并发处理能力,在多CPU的服务器上运行程序,可以并发执行多个任务. 2 ...
- linux下获取软件源码包 centos/redhat, debian/ubuntu
linux下获取软件源码包 centos/redhat, debian/ubuntu centos下: 1. yum install yum-utils 主要为了获取yumdownloader 2. ...
- Linux 内核调度器源码分析 - 初始化
导语 上篇系列文 混部之殇-论云原生资源隔离技术之CPU隔离(一) 介绍了云原生混部场景中CPU资源隔离核心技术:内核调度器,本系列文章<Linux内核调度器源码分析>将从源码的角度剖析内 ...
- (转载)Linux如何编译安装源码包软件
一.什么是源码包软件: 顾名思义,源码包就是源代码的可见的软件包,基于Linux和BSD系统的软件最常见:在国内源可见的软件几乎绝迹:大多开源软件都是国外出品:在国内较为出名的开源软件有fcitx;l ...
- [原创]在Windows和Linux中搭建PostgreSQL源码调试环境
张文升http://ode.cnblogs.comEmail:wensheng.zhang#foxmail.com 配图太多,完整pdf下载请点这里 本文使用Xming.Putty和VMWare几款工 ...
随机推荐
- 30K Star,最全面的PDF处理开源项目,你也可以拥有一个本地的PDF处理大全
大家好,我是程序猿DD 今天给大家推荐一个日常大概率能用上的开源项目:Stirling PDF 开源地址:https://github.com/Stirling-Tools/Stirling-PDF ...
- 在.NET Web API设置响应输出Json数据格式常用的两种方式
前言 在ASP.NET Core Web API中设置响应输出Json数据格式常用以下两种方式:可以通过添加System.Text.Json或Newtonsoft.JsonJSON序列化和反序列化库在 ...
- JavaScript小面试~数组相关的方法和运用(学习笔记)
1,稀疏数组 稀疏数组是指数组中的某个下标未给出值或某个下标的值被删除.例如: let arrayOne=['xiaozi',,12,,true,23] let arrayTwo=[1,2,3,3,4 ...
- vue table表格实现无缝滚动 鼠标进入可悬停
<el-table ref="table" :data="tableData" :header-cell-style="{background: ...
- 支付宝小程序的级联选择器,对接简单操作,Cascader 级联选择器element_ui
首先,对于element_ui 的动接,由于需要数据格式是 但是支付宝提的接口返回的数据是另一种格式,并且支付宝的三级联动接口是先只有一个列表,点击列表项再发现请求,生成另外一个下拉选择, 需要这个三 ...
- 【DataBase】MySQL 27 函数
一.概述 函数 Function,存储过程的用途一致,减少程序逻辑,和数据库服务的连接次数,提高效率 简化操作,提高SQL重用性 函数 和 存储过程的区别? 存储过程允许多个返回的数据,函数只允许一个 ...
- 如何计算两个正太分布的KL散度 —— 正太分布的KL散度 (Kullback-Leibler divergence) 计算
参考: https://blog.csdn.net/int_main_Roland/article/details/124650909 给出实现代码: def get_kl(): mean0, log ...
- 支持AMD GPU —— 如何运行docker环境下的Jax环境
相关: 支持NVIDIA GPU -- 如何运行docker环境下的Jax环境 官方给出的安装主页: https://hub.docker.com/r/rocm/jax 安装命令: docker pu ...
- 程序员学习网站推荐:路线向导(roadmap.sh)
网站地址: https://roadmap.sh/ 在外网的技术论坛上看到这个网站,上面给出多种编程语言的学习路线,也就是给出不同编程语言的从易到难的组成内容(语言特性),通过这个网站可以辅助学习编程 ...
- UBUNTU18.04 SERVER 多显卡 服务器,为防止显卡计算任务出现不意外报错,设置显卡工作状态为:设定持久模式
参考: https://www.cnblogs.com/devilmaycry812839668/p/14799016.html https://www.cnblogs.com/devilmaycry ...