Запись с помощью NAudio с использованием C # - PullRequest
5 голосов
/ 08 августа 2011

Я пытаюсь записать звук в 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 ]

5 голосов
/ 09 августа 2011

Если это весь ваш код, то вам не хватает 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);
    }
}
0 голосов
/ 24 марта 2016

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

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

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

...