基于NAudio实现录制声卡声音

2023-09-20 23:41:16

  之前的文章《测试.net开源音频库NAudio》中介绍了基于NAudio模块中的WaveInEvent和WaveFileWriter类实现基本的录音功能,但存在一个问题:本来想录制视频中的声音,但录音过程中会把麦克风中的杂音(挪动物品的声音、说话声音等)一并录进去。
  NAudio模块中提供有WasapiLoopbackCapture类,能够获取特定输出设备的音频播放数据,再配合WaveFileWriter类即可避免出现杂音。使用比较简单,根据参考文献1中的介绍,直接将录音程序中的WaveInEvent类替换为WasapiLoopbackCapture类,不需要做其它改动,实际测试过程中也确实如此,采用WasapiLoopbackCapture类录制的网页中的视频播放声音,就算是在电脑的麦克风前大声说话或者播放手机声音,都不会被录进去。
  WasapiLoopbackCapture类继承自WasapiCapture类,使用默认构造函数时获取的是默认的音频播放设备(默认应该为获取声卡数据),也可以调用MMDeviceEnumerator可举当前电脑中的所有音频设备,然后用MMDevice类对象实例作为输入参数传入WasapiLoopbackCapture类的构造函数,以录制指定设备的声音。
  为了凑一下篇幅,再把使用的WasapiLoopbackCapture发一下😊:

        private WaveFileWriter m_waveFileWriter;
        private WasapiLoopbackCapture m_capture = new WasapiLoopbackCapture();
        private void btnStartRecord_Click(object sender, EventArgs e)
        {
            m_waveFileWriter = new WaveFileWriter(Path.Combine(txtOutputDir.Text, String.Format("{0}.wav", txtOutputFileName.Text)), m_capture.WaveFormat);
            m_capture.DataAvailable += (s, a) =>
            {
                m_waveFileWriter.Write(a.Buffer, 0, a.BytesRecorded);
            };
            m_capture.StartRecording();
        }

        private void btnEndRecord_Click(object sender, EventArgs e)
        {
            m_capture.StopRecording();
            
            m_waveFileWriter.Dispose();
            m_capture.Dispose();            
        }

参考文献:
[1]https://github.com/naudio/NAudio/blob/master/Docs/WasapiLoopbackCapture.md
[2]https://github.com/naudio/NAudio
[3]https://baike.baidu.com/item/WASAPI/8114771?fr=ge_ala

更多推荐

如何用CRM软件系统提升销售成绩

现如今,不少企业通过办公软件优化业务效率,加强销售管理。其中CRM销售管理系统能够有效提升销售人员的工作效率,提高销售成功率。为什么CRM系统能够提升销售业绩?下面小编从三个方面来概括说一下:为什么CRM系统能够提升销售业绩?1、CRM系统帮助企业建立“以客户为中心”的商业策略。传统企业大多是“以产品为中心,只管推出产

群晖 Docker版qbittorrent 下载显示错误 解决方法

这些天在折腾AIO玩,PVE虚拟机底层,核显直通,群晖安装,免不了踩些坑。今天写篇博客,讲述一下群晖Docker版qbittorrent下载显示错误的解决方法,顺便记录一下配置,以便日后折腾可以参考。直接说结论如果下载显示错误,并且由于自己更改了存储路径,那多半是由于权限设置。去相关的文件夹中添加Owner用户的完全控

透过《眼睛的故事》:需求为何成为纪录片的“价值锚点”?

我们正处在一个内容过载、追求流量的时代。对于观众来说,这是幸运的,也是不幸的。一方面,相比以前能接受到的内容指数级增长,自己的视野无限扩大,但另一方面,“流量思维”下粗制滥制的内容不在少数,对观众来说极其不友好。在内容极为丰盛的时代,观众越来越占主导地位。早在1935年,诺贝尔经济学奖得主哈耶克就提出了“soverei

springboot 调用第三方接口的方式(一)使用RestTemplate方法

简介常用的调用第三方接口的方式:方式一:使用RestTemplate方法方式二:使用原始httpClient请求方式三:使用Feign进行消费通过HTTPClient进行访问第三方接口。但是过程比较复杂,Feign比较适合在springCLoud多模块项目中使用,所以平时基本都是使用RestTemplate方式,这样比

如何使用正则表达式实现Java日志信息的抓取与收集

首先,什么是Java日志信息?简单来说,Java应用程序在运行过程中会输出一些信息,这些信息可以用来追踪程序运行状态、调试错误等。而Java日志信息就是这些输出信息的集合。那么为什么要抓取和收集Java日志信息呢?一方面,这些信息可以帮助我们更好地了解程序的运行情况,及时发现和解决问题;另一方面,对于大型应用程序来说,

Leetcode 01-算法入门与数组-③数组排序

LeetCode01-算法入门与数组-③数组排序一.冒泡排序1.冒泡排序算法思想冒泡排序(BubbleSort)基本思想:经过多次迭代,通过相邻元素之间的比较与交换,使值较小的元素逐步从后面移到前面,值较大的元素从前面移到后面。这个过程就像水底的气泡一样从底部向上「冒泡」到水面,这也是冒泡排序法名字的由来。接下来,我们

打破JSON的束缚:探寻Spring @JsonComponent的灵活性和扩展性

文章首发地址在Spring框架中,@JsonComponent注解用于自定义JSON序列化和反序列化的组件。它可以将一个类标记为一个Json组件,然后在对象的序列化和反序列化过程中,使用自定义的方式来处理JSON数据。使用@JsonComponent注解,需要创建一个类,并使用其中的@JsonComponent注解进行

使用 docker buildx 构建跨平台镜像 (QEMU/buildx/build)

目录1.使用buildx构建跨平台镜像1.1.简介1.2.安装1.3.构建跨平台镜像1.4.跨平台镜像构建策略1.4.1.在内核中使用QEMU仿真支持1.4.2.使用相同的构建器实例在多个本机节点上构建。1.4.3.使用Dockerfile中的多阶段构建,交叉编译到不同的平台架构中。1.5.创建builder1.6.启

Vue系列(四)之 Vue路由介绍和Node.js的环境搭建

目录一.Vue路由1.1Vue路由是什么1.2SPA是什么1.3Vue路由的使用步骤二.Node.js环境搭建2.1Node.js是什么2.2npm是什么2.3Node.js环境搭建1.下载Node.js2.解压3.配置环境变量4.配置npm全局模块路径和cache默认安装位置5.修改npm镜像提高下载速度6.验证安装

MFC扩展库BCGControlBar Pro v33.6亮点 - 流程图、Ribbon Bar功能升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。BCGControlBar专业版v33.6已正式发布了,此版本包含了对图表组件的改进、带隐藏标签的单类功能区栏,标签控制通知徽章和其他新功能、改进等。最新版点击

腾讯云16核服务器配置大全_16核CPU型号性能测评

腾讯云16核CPU服务器有哪些配置可以选择?可以选择标准型S6、标准型SA3、计算型C6或标准型S5等,目前标准型S5云服务器有优惠活动,性价比高,计算型C6云服务器16核性能更高,轻量16核32G28M带宽优惠价3468元15个月,腾讯云百科分享腾讯云16核CPU服务器可以选择的云服务器CVM规格列表:目录腾讯云16

热文推荐