- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
信创国产化已是大势所趋,在国产操作系统上的应用开发的需求越来越多,比如,有客户需要在银河麒麟和统信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界面,然后我们就可以录制桌面图像了.
Oraycn.CPF.RecordDemo.rar 。
源码中包含的非托管库是X64架构的,如果需要在其它架构的国产芯片上运行该程序,可以联系我获取对应架构的非托管库.
。
最后此篇关于C#实现信创国产Linux桌面录制成MP4(源码,银河麒麟、统信UOS)的文章就讲到这里了,如果你想了解更多关于C#实现信创国产Linux桌面录制成MP4(源码,银河麒麟、统信UOS)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试解决 A/V 同步问题。视频将比音频延迟 1 秒。 (请看我下面的注释) 来自 Android 媒体框架部分, 我可以延迟音频时间戳让它与视频同步,我应该从哪里开始?是音频源吗? MPEG4
我正在使用带有 SignalR 的 MassTransit 请求和响应。该网站向创建文件的 Windows 服务发出请求。创建文件后,Windows 服务会将响应消息发送回网站。该网站将打开该文件并使
我正在尝试创建一个允许用户发出一些声音的应用程序,然后以回放方式使用它。 我想让我的应用程序播放用户将记录的.wav文件。 由于不断出现错误,我在弄清楚如何编写此代码时遇到了麻烦。 ====
有没有办法禁止网页上视频的屏幕共享? 例如,当您尝试录制或屏幕共享(例如通过 Skype)Netflix 视频时,它仅显示黑屏并且没有音频。 我的问题是,他们是如何实现的?我只能想到JavaScrip
我正在尝试使用 html5 .getUserMedia 录制视频,然后在不上传到服务器的情况下再次播放。我尝试了很多教程,我通过使用 canvas 绘制 webp 图像然后使用 Whammy.js 转
我想为我的网站的用户实现屏幕录制功能。这将适用于便士拍卖风格的网站,以便用户可以记录他们的出价,并在拍卖出现问题时提供证据。 这是在线录音机的演示。 http://www.screentoaster.
所以在我的应用程序中,我尝试使用屏幕截图“记录”屏幕。我必须将这些单独的帧作为图像,因为它们稍后会在服务器上进行修改和组合。增加这种复杂性的是,它是在使用 Cocos2D 的慢节奏游戏中。我目前截屏的
是否可以使用单个 ffmpeg 命令同时捕获(记录)RTSP 流和捕获场景变化事件?我几乎可以做我想做的事: ffmpeg -i 'rtsp://mystream' \ -map 0:v -map 0
我是 Objective-c 和 iPhone 编程新手,但我正在开发一个自学应用程序。我一直在尝试弄清楚如何在 iPhone 上录制声音。 Apple 提供了使用 AVAudioRecorder 从
我无法写任何东西来允许这样做,但我希望有人能指出我找到可以做到这一点的代码的正确方向。我擅长 HTML 和 CSS,对 JS 非常陌生。 我需要的是能够使用我的麦克风在单页网站上讲话,并将其流回。这样
想象一下您在浏览器中观看体育赛事直播。这意味着您收到了视频流,对吗?我需要记录这个流并保存到磁盘。问题是我不知道从哪里开始。我对编程并不陌生,但在视频直播方面有一些经验。我看到这个问题分为以下几个部分
我在开始录制时遇到文件未找到异常。此外,我无法在 JMeter 可安装文件夹中找到 RootCA 证书。 最佳答案 根据 TestRecording210 JMeter Wiki 页面当用户(您在其下
我有这个源代码可以在浏览器中录制音频。 Record.js 调用另一个脚本提供录音并将其保存到服务器。 index.html record.js //starts by click on butt
我允许用户按下按钮以通过 SoundPool 播放声音。是否可以录制 SoundPool 正在播放的任何内容,以便用户可以录制一系列声音? 最佳答案 实际上不可能捕捉到播放的声音。我也有同样的愿望,但
我正在尝试使用 xcrun simctl io booted recordVideo recording.mov 录制我的 iOS 11.4 模拟器的屏幕。这将创建一个具有该名称的文件,但不幸的是该文
好的,我将尝试尽可能清楚地说明我的问题,但我很困惑,所以如果我没有传达信息,请告诉我。 我正在尝试使用 getUserMedia 来使用网络摄像头,然后使用这个 http://www.w3.org/T
是否可以使用 html5 录制声音?我已经下载了最新的 canary 版本的 chrome 并使用以下代码: navigator.getUserMedia = navigator.webkitGetU
很多人都在问这个,似乎没有人有答案,所以我也没有。 某些应用程序如何提供记录android系统音频输出的功能?我发现的所有内容都是在 1432 个不同站点上的相同教程,您可以在其中记录 MIC 输入。
不小心撞到了qq而不是 @q ,我的 vim 现在正在记录到寄存器 q . 如果我输入 q再次,它将覆盖以前录制的宏。 有没有办法 取消录制以免覆盖之前的宏或 恢复之前的宏而不从头开始重新录制? 最佳
当我们接到电话时,我们会向来电者播放提示,内容类似于“我们可能会出于质量和培训目的记录通话”。 我们为响应来电而发送的 TWiML 如下所示。 http://domain.tld/may_r
我是一名优秀的程序员,十分优秀!