C# 使用Naudio库实现声卡采集麦克风采集+混音

2024-02-15 12:20

本文主要是介绍C# 使用Naudio库实现声卡采集麦克风采集+混音,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C# 使用Naudio库实现声卡采集麦克风采集+混音

using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;namespace ListenerMic
{public partial class Form1 : Form{public Form1(){InitializeComponent();}WasapiLoopbackCapture capture;private void Form1_Load(object sender, EventArgs e){AudioMixer.AudioMixing("recorded.wav", "test.wav", "mixaudio.wav");}public void StartListener(){var outputFilePath = "recorded.wav";capture = new WasapiLoopbackCapture();var writer = new WaveFileWriter(outputFilePath, capture.WaveFormat);capture.DataAvailable += (s, a) =>{writer.Write(a.Buffer, 0, a.BytesRecorded);};capture.RecordingStopped += (s, a) =>{writer.Dispose();writer = null;capture.Dispose();};capture.StartRecording();}private IWaveIn waveIn;private WaveFileWriter writer;private WaveFileWriter sysWriter;/// <summary>/// 开始录音/// </summary>private void StartRecording(){if (waveIn != null) return;waveIn = new WaveIn { WaveFormat = new WaveFormat(48000, 1) };//设置码率writer = new WaveFileWriter("test.wav", waveIn.WaveFormat);waveIn.DataAvailable += waveIn_DataAvailable;waveIn.RecordingStopped += OnRecordingStopped;waveIn.StartRecording();}/// <summary>/// 停止录音/// </summary>private void StopRecording(){waveIn.StopRecording();waveIn.Dispose();}/// <summary>/// 录音中/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void waveIn_DataAvailable(object sender, WaveInEventArgs e){if (this.InvokeRequired){this.BeginInvoke(new EventHandler<WaveInEventArgs>(waveIn_DataAvailable), sender, e);}else{writer.Write(e.Buffer, 0, e.BytesRecorded);int secondsRecorded = (int)(writer.Length / writer.WaveFormat.AverageBytesPerSecond);//录音时间获取//if (secondsRecorded >= 30)//{//    StopRecording();//}}}/// <summary>/// 停止录音/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void OnRecordingStopped(object sender, StoppedEventArgs e){if (this.InvokeRequired){this.BeginInvoke(new EventHandler<StoppedEventArgs>(OnRecordingStopped), sender, e);}else{if (waveIn != null) // 关闭录音对象{waveIn.Dispose();waveIn = null;}if (writer != null)//关闭文件流{writer.Close();writer = null;}if (e.Exception != null){MessageBox.Show(String.Format("出现问题 {0}", e.Exception.Message));}}}private void button1_Click(object sender, EventArgs e){StartRecording();StartListener();}private void button2_Click(object sender, EventArgs e){capture.StopRecording();StopRecording();}}}
using NAudio.Wave;
using NAudio.Wave.SampleProviders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ListenerMic
{public class AudioMixer{/// <summary>/// 音频混合(混音)/// </summary>/// <param name="filePath1">音频文件路径</param>/// <param name="filePath2">音频文件路径</param>/// <param name="mixedPath">混合音频文件路径</param>public static void AudioMixing(string filePath1, string filePath2, string mixedPath){using (var reader1 = new AudioFileReader(filePath1))using (var reader2 = new AudioFileReader(filePath2)){var mixer = new MixingSampleProvider(new[] { reader1, reader2 });WaveFileWriter.CreateWaveFile16(mixedPath, mixer);}}}
}

这篇关于C# 使用Naudio库实现声卡采集麦克风采集+混音的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/711380

相关文章

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB