基于NAudio实现录制声卡声音

本文介绍了如何在.NET开源音频库NAudio中使用WasapiLoopbackCapture类来避免录音时的杂音问题,通过替换WaveInEvent并利用默认或指定音频设备进行无杂音录音。作者提供了代码示例和参考链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  之前的文章《测试.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值