6

我正在尝试使用 NAudio 在 C# 中录制音频。在查看了 NAudio Chat Demo 之后,我使用了那里的一些代码进行记录。

这是代码:

using System;
using NAudio.Wave;

public class FOO
{
    static WaveIn s_WaveIn;

    static void Main(string[] args)
    {
        init();
        while (true) /* Yeah, this is bad, but just for testing.... */
            System.Threading.Thread.Sleep(3000);
    }

    public static void init()
    {
        s_WaveIn = new WaveIn();
        s_WaveIn.WaveFormat = new WaveFormat(44100, 2);

        s_WaveIn.BufferMilliseconds = 1000;
        s_WaveIn.DataAvailable += new EventHandler<WaveInEventArgs>(SendCaptureSamples);
        s_WaveIn.StartRecording();
    }

    static void SendCaptureSamples(object sender, WaveInEventArgs e)
    {
        Console.WriteLine("Bytes recorded: {0}", e.BytesRecorded);
    }
}

但是,没有调用 eventHandler。我正在使用 .NET 版本“v2.0.50727”并将其编译为:

csc file_name.cs /reference:Naudio.dll /platform:x86
4

2 回答 2

6

如果这是您的全部代码,那么您缺少一个message loop. 所有 eventHandler 特定的事件都需要一个消息循环。您可以添加参考ApplicationForm根据您的需要。

这是一个使用示例Form

using System;
using System.Windows.Forms;
using System.Threading;
using NAudio.Wave;

public class FOO
{
    static WaveIn s_WaveIn;

    [STAThread]
    static void Main(string[] args)
    {
        Thread thread = new Thread(delegate() {
            init();
            Application.Run();
        });

        thread.Start();

        Application.Run();
    }

    public static void init()
    {
        s_WaveIn = new WaveIn();
        s_WaveIn.WaveFormat = new WaveFormat(44100, 2);

        s_WaveIn.BufferMilliseconds = 1000;
        s_WaveIn.DataAvailable += new EventHandler<WaveInEventArgs>(SendCaptureSamples);
        s_WaveIn.StartRecording();
    }

    static void SendCaptureSamples(object sender, WaveInEventArgs e)
    {
        Console.WriteLine("Bytes recorded: {0}", e.BytesRecorded);
    }
}
于 2011-08-09T08:17:21.067 回答
1

只需使用WaveInEvent代替,WaveIn代码就可以工作。然后处理发生在单独的线程上,而不是在控制台应用程序中不可用的窗口消息循环中。

进一步阅读:
https ://github.com/naudio/NAudio/wiki/Understanding-Output-Devices#waveout-and-waveoutevent

(该功能是在 2012年添加的,所以在提出问题时它不可用)

于 2016-03-24T19:33:22.803 回答