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;
this.microphoneCapturer.Start();
this.cameraCapturer.Start();
创建并启动录制器:
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);
}
}
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);
}
三. 部署运行
如果要在银河麒麟或统信UOS上运行这里的录制程序,则需要现在目标操作系统上安装.NET Core 3.1。
然后将VS生成目录下的 netcoreapp3.1 文件夹拷贝到目标电脑上,进入netcoreapp3.1文件夹,打开终端,并在终端中输入如下命令:
dotnet Oraycn_Avalonias_RecordDemo.Desktop.dll
回车运行后,就会出现前面截图的UI界面,然后我们就可以录制麦克风摄像头了。
四. 源码下载
Oraycn.Avalonias.RecordDemo.rar
源码中包含的非托管库是X64架构的,如果需要在其它架构的国产芯片上运行该程序,可以联系我获取对应架构的非托管库。
C#实现国产Linux视频录制生成mp4(附源码,银河麒麟、统信UOS)的更多相关文章
- 开源方案搭建可离线的精美矢量切片地图服务-8.mapbox 之sprite大图图标文件生成(附源码)
项目成果展示(所有项目文件都在阿里云的共享云虚拟主机上,访问地图可以会有点慢,请多多包涵). 01:中国地图:http://test.sharegis.cn/mapbox/html/3china.ht ...
- 循序渐进做项目系列(4)迷你QQ篇(2)——视频聊天!(附源码)
一·效果展示 源码派送:MiniQQ1.1 文字聊天的实现参见:循序渐进做项目系列(3):迷你QQ篇(1)——实现客户端互相聊天 二·服务端设计 对于实现视频聊天而言,服务端最核心的工作就是要构造多媒 ...
- Android 音视频深入 十二 FFmpeg视频替换声音(附源码下载)
项目地址,求starhttps://github.com/979451341/AudioVideoStudyCodeTwo/tree/master/FFmpeg%E7%BB%99%E8%A7%86%E ...
- python3GUI--实用!B站视频下载工具(附源码)
目录 一.准备工作 二.预览 1.启动 2.解析 3.下载中 4.下载完成 5.结果 三.设计流程 1.bilibili_video_spider 2.视频json的查找 四.源代码 1.Bilibi ...
- MyBatis model、xml、mapper 自动生成,附源码
Mybatis 代码自动生成 model.xml.mapper 代码结构图 代码地址 https://github.com/shootercheng/codegen 需要修改的地方见 readme
- Java基于POI实现excel任意多级联动下拉列表——支持从数据库查询出多级数据后直接生成【附源码】
Excel相关知识点 (1)名称管理器--Name Manager [CoderBaby]首先需要创建多个名称(包含key及value),作为下拉列表的数据源,后续通过名称引用.可通过菜单:&quo ...
- (干货)基于 veImageX 搭建海报生成平台 -- 附源码
前言 618 年中促销即将来临,很多公司都会通过海报来宣传自己的促销方案,通常情况下海报由设计团队基于 PS.Sketch 等工具创作,后期若想替换海报文案.商品列表等内容则需打开原工程进行二次创作, ...
- linux 软件管理--yum工具及源码包
目录 linux 软件管理--yum工具及源码包 一.yum基本概述 二.yum源的配置 三.yum实践案例 四.yum全局配置文件 五.yum签名检查机制 五.制作本地yum仓库 六.构建企业级yu ...
- 开源即时通讯GGTalk 8.0发布,增加Linux客户端,支持在统信UOS、银河麒麟上运行!
GGTalk在2021年推出7.0后,经过一年多时间的开发,终于推出8.0版本,实现了Linux客户端. 这几年,信创国产化的势头越来越猛,政府事企业单位都在逐步转向使用国产OS.国产CPU.国产数据 ...
- 阿里云视频直播API签名机制源码
阿里云视频直播API签名机制源码 本文展示:通过代码实现下阿里视频直播签名处理规则 阿里云视频直播签名机制,官方文档链接:https://help.aliyun.com/document_detail ...
随机推荐
- ISCSI配置与挂载
ISCSI介绍 iSCSI使用 TCP/IP 协议,来提供网络存储. 客户端挂载后,可以对其进行分区,进行格式化,就好像是安装在本机上的硬盘一样. 为了保证传输速率,通常采用光纤. 配置环境 Cent ...
- W5100 硬件协议栈 调试经验
--- title: W5100 硬件协议栈 调试经验 date: 2020-06-21 11:22:33 categories: tags: - debug - tcpip - w5100 - su ...
- 嵌入式HLS 案例开发步骤分享——基于Zynq-7010/20工业开发板(1)
目 录 前 言 3 1 HLS 开发流程说明 5 1.1 HLS 工程导入 5 1.2 编译与仿真 6 1.3 综合 8 1.4 IP 核封装 10 1.5 IP 核测试 14 前 言 本文主要介绍 ...
- sqlCel查询一个表中部分字段的数据后插入到另一个表中
问题: 部门每天需要从后台系统将物流总表数据导出,Excel中整理出订单的物流发货渠道和发货时间,再手动导入到数据库中,整个过程不麻烦,但在Excel中比较繁琐. 需求: 将这个繁琐的过程变得更简单, ...
- debian12 创建本地harbor镜像库
前言 harbor是一个docker/podman镜像管理库,可用于存储私人镜像.现将本人在debian12系统搭建harbor镜像库的过程记录下来,留作后续参考. 可以参考github harbor ...
- HTTP 和 HTTPS,为什么HTTPS安全?
HTTP协议通常承载与 TCP协议之上,在HTTP和TCP之间添加一个安全协议层(SSL或TSL),这个时候,就成了我们常说的HTTPS 默认HTTP的端口号为80,HTTPS的端口号为443 因为网 ...
- new操作符具体干了什么呢?
new操作符的作用如下: 1.创建一个空对象2.由this变量引用该对象3.该对象继承该函数的原型4.把属性和方法加入到this引用的对象中5.新创建的对象由this引用,最后隐式地返回this.过程 ...
- vue项目的简单创建与插件下载
准备工作 安装node.js 安装node.js过程全部采用默认配置,一步一步next即可 检验node.js是否安装成功:在cmd命令行中输入node -v以及npm -v 通过cmd创建 安装vu ...
- 深度学习论文翻译解析(二十三):Segment Angthing
论文标题:Segment Angthing 论文作者: Alexander Kirillov Eric Mintun Nikhila Ravi Hanzi Mao... 论文地址:2304.02 ...
- Serverless无服务应用架构纵横谈2:边缘计算激战正酣
Serverless无服务应用架构纵横谈2 前言 6年前,我写了一篇<Serverless无服务应用架构纵横谈>. 文中说到无论是公有云FaaS还是私有云FaaS,都不是云计算的未来. 因 ...