Запись с помощью 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 году, поэтому на момент вопроса она не была доступна)