在控制台应用程序中使用 NAudio 录制麦克风音频

Posted

技术标签:

【中文标题】在控制台应用程序中使用 NAudio 录制麦克风音频【英文标题】:recording microphone audio using NAudio in a console application 【发布时间】:2014-07-07 09:32:45 【问题描述】:

我的代码运行并创建了一个 test.wav,但这个文件不包含任何内容。我正在尝试在控制台应用程序中运行此代码。请帮忙

        using System;
        using System.Media;
        using NAudio;
        using NAudio.Wave;

        class sound
        
            public static void Main()
            
                WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(0);
                Console.WriteLine("Now recording...");
                WaveInEvent waveSource = new WaveInEvent();
                waveSource.DeviceNumber = 0;
                waveSource.WaveFormat = new WaveFormat(16000, deviceInfo.Channels);

                //waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);

                string tempFile = (@"C:\Users\user\Desktop\test1.wav");
                WaveFileWriter waveFile = new WaveFileWriter(tempFile, waveSource.WaveFormat);
                waveSource.StartRecording();

            

            //void waveInStream_DataAvailable(object sender, WaveInEventArgs e)
            //
            //    wavefile.WriteData(e.Buffer, 0, e.BytesRecorded);
            //

        

有人可以解释一下被评论的行是什么意思。我是编程初学者。

当我编译程序时,它给出了 2 个错误: 错误 1:非静态字段、方法或属性 'sound.waveSource_DataAvailable(object, NAudio.Wave.WaveInEventArgs)' C:\Users\user\Documents\Visual Studio 2008\Projects\sound\ 需要对象引用声音\Program.cs 18 49 声音

错误 2 当前上下文 C:\Users\user\Documents\Visual Studio 2008\Projects\sound\sound\Program.cs 28 21 sound 中不存在名称“wavefile”

【问题讨论】:

【参考方案1】:

显然StartRecording 方法会启动一些捕获循环,这些循环会定期引发DataAvailable 事件以允许用户收集记录的数据。在您的示例代码中,事件句柄正确地将记录的数据附加到文件tempFile。函数waveInStream_DataAvailablewaveFile 都必须声明为静态。

【讨论】:

tempFile 只是一个存储文件名的字符串。用于保存声波文件....但是我如何将记录的数据附加到它。 通过取消注释行,并将wavefile声明为类的静态成员,以及函数。 我按照你说的做了,程序运行良好。但它仍然没有记录任何内容 查看数据,VytesRecorded 是否不为零?如何停止录制?如果您不关闭正在写入的文件,则可能会丢失内容【参考方案2】:

试试这个:

using System;
using System.Media;
using NAudio;
using NAudio.Wave;

class sound
    
        static WaveFileWriter waveFile;
        public static void Main()
        
            //WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(0);
            Console.WriteLine("Now recording...");
            WaveInEvent waveSource = new WaveInEvent();
            //waveSource.DeviceNumber = 0;
            waveSource.WaveFormat = new WaveFormat(44100, 1);

            waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);

            string tempFile = (@"C:\Users\user\Desktop\test1.wav");
            waveFile = new WaveFileWriter(tempFile, waveSource.WaveFormat);
            waveSource.StartRecording();
            Console.WriteLine("Press enter to stop");
            Console.ReadLine();
            waveSource.StopRecording();
            waveFile.Dispose();
        

        static void waveSource_DataAvailable(object sender, WaveInEventArgs e)
        
            waveFile.WriteData(e.Buffer, 0, e.BytesRecorded);
        

    

【讨论】:

以上是关于在控制台应用程序中使用 NAudio 录制麦克风音频的主要内容,如果未能解决你的问题,请参考以下文章

naudio 从麦克风录制声音然后保存

Naudio 录制麦克风 X 秒

使用 NAudio 录制音频并在麦克风输入静音时写入文件

NAudio 记录和保存麦克风输入和扬声器输出

无法使用麦克风 c# naudio 捕捉 15k 的音调

对于麦克风设备,NAudio 不提供“设备编号”