首页 > 系统相关 >C#实现信创国产Linux麦克风摄像头推流(源码,银河麒麟、统信UOS)

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

时间:2024-10-23 14:48:18浏览次数:1  
标签:UOS 麦克风 C# cameraCapturer 采集 源码 microphoneCapturer 推流 摄像头

随着国际政治经济形势的变化,尤其是中美科技竞争日益激烈,软件信创国产化已经迫在眉睫。在这种大环境下,我们将现有的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架构的,如果需要在其它架构的国产芯片上运行该程序,可以联系我获取对应架构的非托管库。

 

标签:UOS,麦克风,C#,cameraCapturer,采集,源码,microphoneCapturer,推流,摄像头
From: https://www.cnblogs.com/shawshank/p/18494362

相关文章

  • C++多线程同步和加锁的方式
    多线程同步和加锁的方式1.互斥锁(Mutex)互斥锁是一种常见的线程同步机制,用于保护共享资源,确保同一时间只有一个线程可以访问该资源。C++标准库提供了std::mutex类来实现互斥锁。std::mutex的lock()成员函数获取锁,使用完毕后调用unlock()释放锁。推荐使用std::lock_guard......
  • C++实现stack功能
    C++代码实现stack功能,具体代码如下:#include"stdafx.h"#include<iostream>#include<vector>#include<stdexcept>//forstd::out_of_rangetemplate<typenameT>classStack{private: std::vector<T>elements;//底层容器,用于存......
  • Conda常用命令记录(自用记录)
    1.conda创建环境condacreate--namenamepython=3.62.激活环境condaactivatename3.查看所有环境condainfo--envs4.查看当前环境下已经安装的包condalist5.删除环境condaremove--namename--all6.查看当前channelcondaconfig--show7.添加清华源condacon......
  • 腿夹腿,带你用react撸后台,系列一(Vite篇)
    Github地址|文档地址|预览地址react-antd-console是一个后台管理系统的前端解决方案,封装了后台管理系统必要功能(如登录、鉴权、菜单、面包屑、标签页等),帮助开发人员专注于业务快速开发。项目基于React18、Antdesign5、Vite和TypeScript等新版本。对于使......
  • 为什么我强烈推荐大学生打CTF!
    写这个文章是因为我很多粉丝都是学生,经常有人问:感觉大一第一个学期忙忙碌碌的过去了,啥都会一点,但是自己很难系统的学习到整个知识体系,很迷茫,想知道要如何高效学习。编辑这篇文章我主要就围绕两点,减少那些罗里吧嗦的废话,直接上干货:CTF如何学习?打CTF有什么用1.CTF如......
  • Vulnhub打靶-ICA
    基本信息靶机下载:https://download.vulnhub.com/ica/ica1.zip攻击机器:192.168.20.128(Windows操作系统)&192.168.20.138(kali)提示信息:根据我们的情报网络提供的信息,ICA正在进行一个秘密项目。我们需要找出这个项目是什么。获得访问信息后,请将其发送给我们。我们将设置一......
  • EHOME视频平台EasyCVR萤石设备视频接入平台的汇聚与应用
    EHOME视频平台EasyCVR支持接入符合标准协议的摄像头,提供一体化的视频安防解决方案,包括设备管理、视频存储、监控回放和用量统计等功能。该平台实现了实时监控管理,广泛应用于安全生产、平安城市和智慧校园等多个场景。一、平台特点1、多协议支持:EasyCVR支持多种视频流协议,如ONVIF......
  • Mac下为php7.3编译安装Redis扩展(phpredis)教程(使用brew安装的php)
    Mac下为php7.3编译安装Redis扩展(phpredis)教程(使用brew安装的php)_brewphp7.3扩展-CSDN博客此文章为在mac下为php7.*编译安装redis拓展的教程,本教程默认用户已经安装brew,并且php为brew安装,没有安装可自行安装。1.先安装环境依赖。brewinstallautoconfwget若已经安装可......
  • 腾讯云的TDSQL-H LibraDB,底层是Clickhouse
    一.java版本引用方式通过jdbc可参考腾讯文档https://cloud.tencent.com/document/product/1488/79810<dependency><groupId>ru.yandex.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.3.2</version><......
  • [CSP-S2020] VP
    【比赛地址】省流:\(100+100+70+55\to100+100+70+0,325\to270\)[CSP-S2020]儒略日乱搞。这道题太恶心了,场上用了\(1h\)才做出来。代码过于抽象,不放了。[CSP-S2020]动物园非常简单的黄题。#include<bits/stdc++.h>usingnamespacestd;unsignedlonglongn,m,c,k......