C#将国产Linux视频录制生成mp4的具体实现

 更新时间:2024年08月21日 09:33:27   作者:!chen  
这篇文章主要介绍了C#将国产Linux视频录制生成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界面,然后我们就可以录制麦克风摄像头了。

到此这篇关于C#将国产Linux视频录制生成mp4的具体实现的文章就介绍到这了,更多相关C# Linux视频生成mp4内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单C#代码实现modbus-rtu通讯发送数据方式

    简单C#代码实现modbus-rtu通讯发送数据方式

    这篇文章主要介绍了简单C#代码实现modbus-rtu通讯发送数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • C#微信开发之获取接口调用凭据

    C#微信开发之获取接口调用凭据

    本文主要介绍了C#微信开发之接收 / 返回文本消息原理与实现方法,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • C#实现线性查找算法

    C#实现线性查找算法

    这篇文章介绍了C#实现线性查找的算法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • C#操作Windows服务类System.ServiceProcess.ServiceBase

    C#操作Windows服务类System.ServiceProcess.ServiceBase

    这篇文章介绍了C#操作Windows服务类System.ServiceProcess.ServiceBase,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#调用Python程序传参数获得返回值

    C#调用Python程序传参数获得返回值

    C# 调用 Python 程序有多种方式,本文主要介绍了4种方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 基于WPF实现简单放大镜效果

    基于WPF实现简单放大镜效果

    这篇文章主要为大家详细介绍了WPF如何实现简单放大镜效果,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
    2022-12-12
  • 基于WebClient实现Http协议的Post与Get对网站进行模拟登陆和浏览实例

    基于WebClient实现Http协议的Post与Get对网站进行模拟登陆和浏览实例

    这篇文章主要介绍了基于WebClient实现Http协议的Post与Get对网站进行模拟登陆和浏览的方法,以实例形式详细分析了WebClient模拟POST与GET登陆与浏览的过程,对于C#项目开发来说具有不错的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • C# lock线程锁的用法

    C# lock线程锁的用法

    在C#中,锁lock是一种同步机制,允许在同一时间只允许一个线程访问指定的代码或区域,本文主要介绍了C# lock线程锁的用法,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • C#列出当前系统所有正在运行程序的方法

    C#列出当前系统所有正在运行程序的方法

    这篇文章主要介绍了C#列出当前系统所有正在运行程序的方法,涉及C#操作系统进程的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • c# 获取字符串的字节数的方法

    c# 获取字符串的字节数的方法

    本篇文章主要是对c#中获取字符串的字节数的方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01

最新评论