Запись с помощью NAudio с использованием C#

Я пытаюсь записать звук в C# с помощью NAudio. Посмотрев демоверсию чата NAudio, я использовал для записи некоторый код.

Вот код:

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

2 ответа

Решение

Если это весь ваш код, то вам не хватает message loop, Все специфичные события eventHandler требуют цикла сообщений. Вы можете добавить ссылку на Application или же Form согласно вашей потребности

Вот пример использования 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);
    }
}

Просто используйте WaveInEvent вместо WaveIn и код будет работать. Затем обработка происходит в отдельном потоке, а не в цикле сообщений окна, который недоступен в консольном приложении.

Дальнейшее чтение:
https://github.com/naudio/NAudio/wiki/Understanding-Output-Devices

(Функция была добавлена в 2012 году, поэтому на момент вопроса она не была доступна)

Другие вопросы по тегам