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 ...
随机推荐
- IoTBrowser V2.0:引领物联网时代的全新浏览器
强大的兼容性,无限的可能 IoTBrowser V2.0,基于Chromium内核,完美支持H5/css/js开发界面,让您的物联网应用拥有与主流浏览器同等的流畅体验.同时,它还支持CSS 3动画.C ...
- vim中ctags 的使用
--- title: vim中ctags 的使用 EntryName: vim-config-with-ctags date: 2020-08-19 11:17:38 categories: tags ...
- 阿里面试:说说@Async实现原理?
@Async 是 Spring 3.0 提供的一个注解,用于标识某类(下的公共方法)或某方法会执行异步调用. 接下来,我们来看下 @Async 的基本使用和实现原理. 1.基本使用 @Async 基本 ...
- TCP/UDP 协议和 HTTP/FTP/SMTP 协议之间的区别
前言 我们经常会听到HTTP协议.TCP/IP协议.UDP协议.Socket.Socket长连接.Socket连接池等字眼,然而它们之间的关系.区别及原理并不是所有人都能理解清楚. 计算机网络体系结构 ...
- Vue3 如何接入 i18n 实现国际化多语言
1. 基本方法 在 Vue.js 3 中实现网页的国际化多语言,最常用的包是 vue-i18n,通常我们会与 vue-i18n-routing 一起使用. vue-i18n 负责根据当前页面的语言渲染 ...
- Peaks:每周至少要进行一次用户访谈?
名字:Peaks 开发者 / 团队:Vogelhaus Apps GmbH 平台:iOS.watchOS 请简要介绍下这款产品 每个人生活的节奏都有一个内置的生理时钟,这就是所谓的昼夜节律.它不仅控制 ...
- TP3.2与TP5.0的区别
1. 控制器输出return $this->fetch(); ----5$this->display(); ----3.2单字母函数去掉了 如:M() D() U() S() C() 3. ...
- MYSQL DQL in 到底会不会走索引&in 范围查询引发的思考。
前情引子 in 会不会走索引?很多人肯定会回答.废话.如果命中了索引.那肯定会走. 其实我和大多数人一样.一开始也是这么想的.直至有一个血淋淋的案子让我有所改观.有所思考. 背景介绍 业务的工单表.我 ...
- abc--cf训练日常总结
ABC 最近遇到好多思维和位运算的题目不会做,特地过来总结一些小小的知识点. 思维题目 https://atcoder.jp/contests/abc353/tasks/abc353_c 这道题目要求 ...
- Vue 基于vue-codemirror实现的代码编辑器
基于vue-codemirror实现的代码编辑器 开发环境 jshint 2.11.1 jsonlint 1.6.3 script-loader 0.7.2 vue 2.6.11 vue-codemi ...