随着国际政治经济形势的变化,尤其是中美科技竞争日益激烈,软件信创国产化已经迫在眉睫。在这种大环境下,我们将现有的Windows版软件逐步迁移到信创国产化基础设施上,适配国产操作系统(如银河麒麟、统信UOS)、国信芯片(如飞腾、鲲鹏、海光、龙芯、麒麟)以及国产DB。

我们经常有这样的需求,比如需要在银河麒麟或统信UOS上实现RTMP推流摄像头视频和麦克风声音到流媒体服务器(如nginx或srs),那么这个要如何实现了?

一. 技术方案

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

(1)麦克风数据采集。

(2)摄像头数据采集。

(3)音频数据AAC编码。

(4)视频数据H264编码。

(5)将编码后的数据按RTMP协议推送给流媒体服务器。

(6)通过时间戳(PTS)保证音频视频的同步。

我们使用跨平台的 .NET Core (C#),跨平台的UI框架Avalonia,再借助 LinuxCapture 和 NPusher.NetCore 这两个组件,就很容易采集到麦克风和摄像头的数据,并且将它们推流到流媒体服务器上。

我们先看看推流程序在银河麒麟上的运行效果:

两个下拉列表可以选择要使用的麦克风和摄像头设备。

点击“开始”按钮,麦克风和摄像头将开始采集数据,并推流至流媒体Server。

如果中途网络断开,推流将会中断,并尝试自动重连,重连成功后,将恢复推流。

点击“结束”按钮,则将结束音视频采集和推流。

二.具体实现

(1)ICameraCapturer是摄像头视频采集组件;IMicrophoneCapturer是麦克风声音采集组件。

(2)我们可以通过调用CapturerFactory的CreateXXXX方法来创建对应的采集器实例。

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

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

(5)将拿到的数据喂给IStreamPusher,就会将其推流到指定的流媒体服务器。

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

创建并启动采集器:

            //摄像头采集器
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();

创建并启动推流器:

           string nginxServerIP = ConfigurationManager.AppSettings["NginxServerIP"];
int nginxServerPort = int.Parse(ConfigurationManager.AppSettings["NginxServerPort"]);
string rtmpUrl = $"rtmp://{nginxServerIP}:{nginxServerPort}/hls/{streamID}";
this.streamPusher.UpsideDown4RGB24 = true;
this.streamPusher.Initialize(rtmpUrl, videoSize.Width, videoSize.Height, InputAudioDataType.PCM, InputVideoDataType.RGBA, this.channelCount);

将采集到的数据喂给推流器:

private void CameraCapturer_ImageCaptured(byte[] agba32Data)
{
if (this.isRecording)
{
this.streamPusher.PushVideoFrame(agba32Data);
UiSafeInvoker.ActionOnUI(() =>
{
WriteableBitmap writeableBitmap = CreateBitmapFromPixelData(agba32Data, videoSize.Width, videoSize.Height);
img.Source = writeableBitmap;
});
}
} private void MicrophoneCapturer_AudioCaptured(byte[] pcm)
{
if (this.isRecording)
{
this.streamPusher.PushAudioFrame(pcm);
}
}

推流器内部会对音视频数据进行编码,并依据RTMP协议发送给流媒体服务器。

停止推流:

private void FinishRecorded(bool success)
{
this.RecordState_Changed(false);
this.cameraCapturer?.Stop();
this.cameraCapturer?.Dispose();
this.microphoneCapturer?.Stop();
this.microphoneCapturer?.Dispose();
this.streamPusher?.Close();
string tip = success ? "推流停止!" : "推流器断开,推流停止!";
ShowStateMsg(tip);
}

三. 部署运行

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

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

dotnet Oraycn_Avalonias_PusherDemo.Desktop.dll

回车运行后,就会出现前面截图的UI界面,然后我们就可以预览摄像头,并开始推流麦克风摄像头了。

四. 源码下载

Oraycn.Avalonias.PusherDemo.rar

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

C#实现信创国产Linux麦克风摄像头推流(源码,银河麒麟、统信UOS)的更多相关文章

  1. Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装

    原文:Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装 Linux内核分析(一) 从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底 ...

  2. Linux 系统下用源码包安装软件

    Linux系统下用源码包安装软件 by:授客 QQ:1033553122 下载源码安装包,解压或者直接双击打开(如果有安装zip或rar等压缩/解压缩软件的话),查找相关的安装说明文件,一般是READ ...

  3. TongWEB与JOnAS 对比,国产中间件战斗机东方通TongWEB源码解析

    转自网址: http://bbs.51cto.com/thread-489819-1-1.html 首先需要声明的是,本人出于技术爱好的角度,以下的文字只是对所看到的一些情况的罗列,偶尔附加个人的一些 ...

  4. 转载~Linux 平台下阅读源码的工具

    Linux 平台下阅读源码的工具 前言 看源代码是一个程序员必须经历的事情,也是可以提升能力的一个捷径.个人认为: 要完全掌握一个软件的方法只有阅读源码在Windows下有sourceinsight这 ...

  5. linux线程池thrmgr源码解析

    linux线程池thrmgr源码解析 1         thrmgr线程池的作用 thrmgr线程池的作用是提高程序的并发处理能力,在多CPU的服务器上运行程序,可以并发执行多个任务. 2      ...

  6. linux下获取软件源码包 centos/redhat, debian/ubuntu

    linux下获取软件源码包 centos/redhat, debian/ubuntu centos下: 1. yum install yum-utils 主要为了获取yumdownloader 2. ...

  7. Linux 内核调度器源码分析 - 初始化

    导语 上篇系列文 混部之殇-论云原生资源隔离技术之CPU隔离(一) 介绍了云原生混部场景中CPU资源隔离核心技术:内核调度器,本系列文章<Linux内核调度器源码分析>将从源码的角度剖析内 ...

  8. 基于Linux平台的libpcap源码分析和优化

    目录 1..... libpcap简介... 1 2..... libpcap捕包过程... 2 2.1        数据包基本捕包流程... 2 2.2        libpcap捕包过程... ...

  9. (转载)Linux如何编译安装源码包软件

    一.什么是源码包软件: 顾名思义,源码包就是源代码的可见的软件包,基于Linux和BSD系统的软件最常见:在国内源可见的软件几乎绝迹:大多开源软件都是国外出品:在国内较为出名的开源软件有fcitx;l ...

  10. Linux 安装node.js ---- 源码编译的方式

    一 : 普通用户: 安装前准备环境: 1.检查Linux 版本 命令: cat /etc/redhat-release 2.检查 gcc.gcc-c++ 是否安装过 命令: rpm -q gcc rp ...

随机推荐

  1. 在WSL Ubuntu中设置sshd自启动

    参考: https://blog.csdn.net/android_cai_niao/article/details/128490566 ------------------------------- ...

  2. 使用django-treebeard实现树类型存储与编辑

    前言 其实之前做很多项目都有遇到跟树相关的功能,以前都是自己实现的,然后前端很多UI组件库都有Tree组件,套上去就可以用. 不过既然用 Django 了,还是得充分发挥一下生态的优势,但是我找了半天 ...

  3. 横扫鸿蒙弹窗乱象,SmartDialog出世

    前言 但凡用过鸿蒙原生弹窗的小伙伴,就能体会到它们是有多么的难用和奇葩,什么AlertDialog,CustomDialog,SubWindow,bindXxx,只要大家用心去体验,就能发现他们有很多 ...

  4. ApplicationRunner的讲解

    在开发中可能会有这样的情景.需要在容器启动的时候执行一些内容.比如读取配置文件,数据库连接之类的.SpringBoot给我们提供了两个接口来帮助我们实现这种需求.这两个接口分别为CommandLine ...

  5. vue中使用better-scroll

    1.创建vue-cli3项目   指令 vue create 项目名 2.要想使用better-scroll 需要先引入 better-scroll的插件 这里采用 npm的方式    指令 npm ...

  6. CH03_布局

    第3章:布局 本章目标 理解布局的原则 理解布局的过程 理解布局的容器 掌握各类布局容器的运用 理解 WPF 中的布局 WPF 布局原则 ​ WPF 窗口只能包含单个元素.为在WPF 窗口中放置多个元 ...

  7. Redis高可用方案:使用Keepalived实现主备双活

    注意:请确保已经安装Redis和keepalived,本文不在介绍如何安装. 1.使用版本说明 Redis版本:5.0.2 Keepalived版本:1.3.5 Linux 版本:Centos7.9 ...

  8. .NET 最好用的验证组件 FluentValidation

    前言 一个 .NET 验证框架,支持链式操作,易于理解,功能完善,组件内提供十几种常用验证器,可扩展性好,支持自定义验证器,支持本地化多语言. 项目介绍 FluentValidation 是一个开源的 ...

  9. LCD屏幕显示PNG图像

    正点原子LCD屏幕显示PNG图像 本文概要 这段时间在学习正点原子的IMX6ULL开发板,在应用编程中有一个代码练习是需要在LCD屏幕上显示PNG图像,但由于我的屏幕参数和教程中的有些出入,于是经过自 ...

  10. (赠书)国产开源视觉语言模型CogVLM2在线体验:竟能识别黑悟空

    CogVLM2是一款视觉语言模型(Visual Language Model),由智谱AI和清华KEG潜心打磨.这款模型是CogVLM的升级版本,支持高达 1344 * 1344 的图像分辨率,提供支 ...