using OpenCvSharp;
using NAudio.Wave;
// 定义视频和音频的参数
int fps = 30;
Size videoSize = new Size(640, 480);
WaveFormat audioFormat = new WaveFormat(44100, 16, 2);
// 创建视频编码器
VideoWriter videoWriter = new VideoWriter("output.avi", FourCC.XVID, fps, videoSize, true);
// 创建音频录制器
WaveFileWriter audioWriter = new WaveFileWriter("audio.wav", audioFormat);
// 创建视频捕获器
VideoCapture videoCapture = new VideoCapture(0);
videoCapture.Set(CaptureProperty.FrameWidth, videoSize.Width);
videoCapture.Set(CaptureProperty.FrameHeight, videoSize.Height);
videoCapture.Set(CaptureProperty.Fps, fps);
// 创建音频捕获器
WaveInEvent audioCapture = new WaveInEvent();
audioCapture.WaveFormat = audioFormat;
audioCapture.DataAvailable += (sender, e) =>
{
audioWriter.Write(e.Buffer, 0, e.BytesRecorded);
};
// 开始录制音频和视频
videoWriter.Open();
videoCapture.Start();
audioCapture.StartRecording();
while (true)
{
Mat frame = new Mat();
videoCapture.Read(frame);
if (frame.Empty())
break;
videoWriter.Write(frame);
Cv2.ImShow("video", frame);
if (Cv2.WaitKey(1) == 27)
break;
}
// 停止录制音频和视频
videoCapture.Release();
videoWriter.Release();
Cv2.DestroyAllWindows();
audioCapture.StopRecording();
audioWriter.Close();
audioWriter.Dispose();
// 合并音视频
var videoFile = new MediaFile { Filename = "output.avi" };
var audioFile = new MediaFile { Filename = "audio.wav" };
var outputFile = new MediaFile { Filename = "output.mp4" };
using (var engine = new Engine())
{
engine.Convert(videoFile, audioFile, outputFile);
}

首先定义了视频和音频的参数。然后创建了视频编码器和音频录制器,以便能够将视频和音频写入文件。接下来创建了视频和音频的捕获器,以便能够从摄像头和麦克风捕获图像和声音。 在主循环中不断从摄像头中读取图像,并将其写入视频文件中。同时通过OpenCVSharp的ImShow函数将图像显示在屏幕上。当用户按下ESC键时,程序退出主循环。 最后,我们停止录制音频和视频,并将它们合并成一个MP4文件。这里我们使用了FFmpeg的C#封装库FFmpeg.NET来进行音视频合并。

如果是使用了Accord.Net

using Accord.Video.DirectShow;
using Accord.Video.FFMPEG; // ... // 创建一个VideoCaptureDevice对象,用于捕获音频和视频
var videoSource = new VideoCaptureDevice(/* 设备名称 */); // 创建一个AudioCaptureDevice对象,用于捕获音频
var audioSource = new AudioCaptureDevice(/* 设备名称 */); // 创建一个AVIWriter对象,用于将音频和视频写入文件
var writer = new VideoFileWriter(); // 设置writer的参数
writer.FrameRate = /* 帧率 */;
writer.VideoCodec = /* 视频编解码器 */;
writer.AudioCodec = /* 音频编解码器 */;
writer.AudioBitRate = /* 音频比特率 */;
writer.AudioSampleRate = /* 音频采样率 */;
writer.AudioChannels = /* 音频通道数 */; // 打开writer
writer.Open(/* 文件路径 */, /* 视频宽度 */, /* 视频高度 */, /* 是否包含音频 */); // 开始捕获音频和视频
videoSource.Start();
audioSource.Start(); // 捕获音频和视频并写入文件
while (/* 是否继续录制 */)
{
// 捕获视频帧
var videoFrame = videoSource.WaitForFrame(); // 捕获音频帧
var audioFrame = audioSource.WaitForFrame(); // 将音频和视频帧写入文件
writer.WriteVideoFrame(videoFrame);
writer.WriteAudioFrame(audioFrame);
} // 停止捕获音频和视频
videoSource.Stop();
audioSource.Stop(); // 关闭writer
writer.Close();

简单的示例代码

C#中录制带有声音的视频并保存下来,使用OpenCVSharp和NAudio库或者是Accord.Net的更多相关文章

  1. ios怎样实现快速将显卡中数据读出压缩成视频在cocos2dx扩展开发中

    如果解决ios怎样实现快速将显卡中数据读出压缩成视频在cocos2dx扩展开发中 手机平台性能是个关键问题. 压缩视频分成3个步骤: 读取显卡数据, 使用编码器压缩,保存文件. 使用libav 压缩的 ...

  2. 使用 Python 的 sounddevice 包录制系统声音

    博客中的文章均为meelo原创,请务必以链接形式注明本文地址 sounddevice是一个与Numpy兼容的录音以及播放声音的包. 安装sounddevice包 直接通过pip就能安装. pip in ...

  3. Android 使用WebView浏览有声音或者视频的网页,关闭WebView之后,声音或者视频不停止的解决办法

    笔者最近使用Eclipse开发Android移动应用app,其实有一个功能是使用Android系统自带的WebView控件加载Web页面.开发很顺利,浏览也很正常.不过有个比较特殊的一点就是加载的We ...

  4. 解决:信息中插入avi格式的视频时,提示“unsupported video format”

    [测试步骤]:新建信息,添加AVI格式的视频 [测试结果]:添加时弹出提示"unsupported video format" 该问题主要提现在手机彩信视频附件不支持该AVI格式的 ...

  5. 在wpf中如何让MediaElement的视频循环播放

    原文:在wpf中如何让MediaElement的视频循环播放 MediaElement原始的播放是只播放一遍:如何设置让MediaElement播放 的视频或者音频循环播放,解决如下: 修改Media ...

  6. 删除Win10资源管理器中的3D对象/音乐/视频文件夹

    Win10如何删除资源管理器中的3D对象/音乐/视频等文件夹?使用Win10系统的用户都知道,打开此电脑之后,资源管理上面会显示文档/音乐/视频等7个文件夹,一些用户认为很少使用到它们,想要除之而后快 ...

  7. (转)python中函数参数中如果带有默认参数list的特殊情况

    在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 1 2 3 4 5 6 7 8 9 def f(x,l=[]):     for i in range(x):         ...

  8. 删除centos7中自带有python2.7

    删除centos7中自带有python2. ()强制删除已安装python及其关联 # rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps ...

  9. MATLAB检查指定路径中的子文件夹中的文件名中是否带有空格

    测试文件夹为: clear;close all;clc; %% %程序实现的功能 %检查指定路径中的子文件夹中的文件名中是否带有空格,并去掉文件名中的空格 %% %程序中用到的之前不清楚的函数如下 % ...

  10. Vue中如何插入m3u8格式视频,3分钟学会!

    ​        大家都知道video只支持ogg.webm.MP4格式,但是要是m3u8格式的视频怎么办?最近遇到这个问题在网上找了好多办法都不行,最后找到video.js后才完美解决,所以决定写一 ...

随机推荐

  1. Unity il2cpp GC

    截止2019版本,il2cpp使用的都是Boehm-Demers-Wiser

  2. 深度优先及广度优先在Unity中的应用

    说明: 简单总结一下深度优先算法和广度优先算法在Unity中最直观和最多见的使用.这里我所举的例子是应用到Unity中3D 人物的全部骨骼关键的遍历,推广开就是能够对全部物体的层级关系进行简单的遍历. ...

  3. JAVA基础之多线程三期--线程安全问题

    一.线程安全问题就是指:多个线程并发访问同一个资源而发生安全性的问题, 线程安全问题都是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写 操作,一般来说,这个全局变量是 ...

  4. java基础之继承,抽象类

    一.继承 :就是子类继承父类的非私有属性和行为 二.特点 1.子类和父类中出现了同名的成员变量时,在子类中需要访问父类中非私有成员变量时,需要使用 super 关键字 格式:super.父类成员变量名 ...

  5. Git放弃本地修改,强制拉取最新版

    git fetch –-all git reset –-hard origin/master git fetch : 下载远程的库的内容(不做合并): git reset :指令把HEAD指向mast ...

  6. Asp.net mvc基础(七)cshtml页面中自动using

    场景如下: 在cshtml页面中,如果要在页面中进行初始化一个类的时候,需要添加这个类的命名空间才可以. 对于这种情况,我们可以通过配置Web.config达到在cshtm页面的使用类的时候不需要进行 ...

  7. 【完结】【一本通提高】KMP做题记录

    题目编号 标题 估分 正确 提交 Y 2076 Problem  A [一本通提高篇KMP]剪花布条 --- 156 293 Y 2077 Problem  B [一本通提高篇KMP]Radio Tr ...

  8. 容器镜像基础(nydus)

    " 包括 nydus 的基本概念.架构和容器镜像加速使用方法. 1. nydus 1.1 存在的问题 对于容器镜像使用者 问题一:启动容器慢:容器启动慢的情况普遍发生在当用户启动一个很大的容 ...

  9. LLM Agent的构建:OpenAI官方指南解读

    本文是对 OpenAI 近期发布的<A Practical Guide to Building Agents>的读后感与总结 Agent火爆的背景 大型语言模型(LLM)处理复杂.多步骤任 ...

  10. TVM Pass优化 -- 公共子表达式消除(Common Subexpr Elimination, CSE)

    定义(What) 公共子表达式消除 就是如果表达式E的值已经计算的到了,并且自计算的到值后E的值就不再改变了,就说,表达式E在后续计算中是一个公共表达式. 简单说,该表达式上面已经执行过了,下面没必要 ...