基于NAudio实现录制声卡声音

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现变音播放,您可以使用NAudio库中的`WaveFormatConversionStream`类来实现。该类允许您将音频转换为不同的采样率和位深度,从而实现音高的变化。 以下是一个示例代码,演示如何使用`WaveFormatConversionStream`类来实现变音播放: ```csharp using NAudio.Wave; //创建一个WaveOutEvent对象,用于播放音频 WaveOutEvent outputDevice = new WaveOutEvent(); //创建一个Mp3FileReader对象来读取mp3文件 Mp3FileReader reader = new Mp3FileReader("example.mp3"); //创建一个WaveFormatConversionStream对象,用于变换采样率 WaveFormatConversionStream convertedStream = new WaveFormatConversionStream(new WaveFormat(8000, 16, 1), reader); //将WaveFormatConversionStream对象包装在BlockAlignReductionStream对象中 //此步骤是必需的,因为WaveOutEvent需要波形块大小为多个字节的音频 WaveStream blockAlignedStream = new BlockAlignReductionStream(convertedStream); //将BlockAlignReductionStream对象设置为WaveOutEvent的输出源 outputDevice.Init(blockAlignedStream); //开始播放音频 outputDevice.Play(); ``` 在上面的示例代码中,我们使用`WaveFormatConversionStream`类将音频采样率从默认的44100 Hz降低到8000 Hz,从而将音高降低了约1个八度。如果要升高音高,则可以将采样率提高到更高的值。 需要注意的是,变音播放可能会导致音频质量损失,因此建议您使用高质量的音频文件并尝试不同的采样率来找到最佳效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值