C#中录制带有声音的视频并保存下来,使用OpenCVSharp和NAudio库或者是Accord.Net
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的更多相关文章
- ios怎样实现快速将显卡中数据读出压缩成视频在cocos2dx扩展开发中
如果解决ios怎样实现快速将显卡中数据读出压缩成视频在cocos2dx扩展开发中 手机平台性能是个关键问题. 压缩视频分成3个步骤: 读取显卡数据, 使用编码器压缩,保存文件. 使用libav 压缩的 ...
- 使用 Python 的 sounddevice 包录制系统声音
博客中的文章均为meelo原创,请务必以链接形式注明本文地址 sounddevice是一个与Numpy兼容的录音以及播放声音的包. 安装sounddevice包 直接通过pip就能安装. pip in ...
- Android 使用WebView浏览有声音或者视频的网页,关闭WebView之后,声音或者视频不停止的解决办法
笔者最近使用Eclipse开发Android移动应用app,其实有一个功能是使用Android系统自带的WebView控件加载Web页面.开发很顺利,浏览也很正常.不过有个比较特殊的一点就是加载的We ...
- 解决:信息中插入avi格式的视频时,提示“unsupported video format”
[测试步骤]:新建信息,添加AVI格式的视频 [测试结果]:添加时弹出提示"unsupported video format" 该问题主要提现在手机彩信视频附件不支持该AVI格式的 ...
- 在wpf中如何让MediaElement的视频循环播放
原文:在wpf中如何让MediaElement的视频循环播放 MediaElement原始的播放是只播放一遍:如何设置让MediaElement播放 的视频或者音频循环播放,解决如下: 修改Media ...
- 删除Win10资源管理器中的3D对象/音乐/视频文件夹
Win10如何删除资源管理器中的3D对象/音乐/视频等文件夹?使用Win10系统的用户都知道,打开此电脑之后,资源管理上面会显示文档/音乐/视频等7个文件夹,一些用户认为很少使用到它们,想要除之而后快 ...
- (转)python中函数参数中如果带有默认参数list的特殊情况
在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 1 2 3 4 5 6 7 8 9 def f(x,l=[]): for i in range(x): ...
- 删除centos7中自带有python2.7
删除centos7中自带有python2. ()强制删除已安装python及其关联 # rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps ...
- MATLAB检查指定路径中的子文件夹中的文件名中是否带有空格
测试文件夹为: clear;close all;clc; %% %程序实现的功能 %检查指定路径中的子文件夹中的文件名中是否带有空格,并去掉文件名中的空格 %% %程序中用到的之前不清楚的函数如下 % ...
- Vue中如何插入m3u8格式视频,3分钟学会!
大家都知道video只支持ogg.webm.MP4格式,但是要是m3u8格式的视频怎么办?最近遇到这个问题在网上找了好多办法都不行,最后找到video.js后才完美解决,所以决定写一 ...
随机推荐
- study Python3 【1】
用VSCode来编辑Python代码,作为IDE使用,有点头晕. https://www.runoob.com/python3/python-vscode-setup.html有介绍.还有更好的博客介 ...
- 感觉程序员要被 AI 淘汰了?学什么才有机会?
感觉程序员要被 AI 淘汰了?学什么才有机会? ️ 推荐观看视频版:https://www.bilibili.com/video/BV1i9Z8YhEja AI 会淘汰程序员么? 我的答案是 &quo ...
- .net core基础(一):安装并创建第一个webapi
一..net介绍 .net是一个开发者平台的统称,用它可以构建多种类型的应用程序. .net平台下的开发语言:C#,F#,Visual Basic .net平台标准:.NET Standard .ne ...
- 【代码审计】Emlog存在SQL注入+XSS漏洞
1.源码简介 EMLOG 是一款轻量级开源博客和CMS建站系统,速度快.省资源.易上手,适合各种规模的站点搭建. 2.漏洞描述 EMLOG $keyword参数存在SQL注入漏洞. EMLOG art ...
- 解决get和post请求提交数据中文乱码问题
目录 get请求乱码 乱码案例 解决办法 方法一:进行转码 方法二:修改tomcat中conf/server.xml post请求乱码 解决办法:在取参数之前设置编码格式 get请求乱码 Tomcat ...
- 鸿蒙开发中console.log和hilog的区别
在日常开发中打印日志是调试程序非常常用的操作,在鸿蒙的官方文档中介绍了hilog这种方式,有些前端转过来的友友发现console.log也可以进行日志打印.有一段时候幽蓝君也非常喜欢使用console ...
- CentOS 7.6 安装JDK 1.8
第一步,下载一个rpm包,下载链接如下 https://www.oracle.com/cn/java/technologies/downloads/ 第二步:上传到服务器中 第三步:输入命令进行安装 ...
- WPF竖向排列的按钮
<Button Width="100" Height="150"> <Button.Content> <TextBlock Tex ...
- Solon Ai Flow 编排开发框架发布预告(效果预览)
Solon Ai 在推出 Solon Ai Mcp 后,又将推出 Solon Ai Flow. 1.Solon Ai Flow 是个啥? Solon Ai Flow 是一个智能体编排开发框架(基于 s ...
- Qt图像处理技术四:图像二值化
Qt图像处理技术四:图像二值化 github 如果你觉得有用的话,期待你的小星星 实战应用项目: github :https://github.com/dependon/simple-image-fi ...