Исключение NAudio InvalidOperationException при построении WaveIn

Я очень новичок в NAudio и пытаюсь написать небольшую программу, которая записывает звук с микрофона и записывает его в файл Wave. Когда я вызываю функцию recordStuff () в основной функции моей программы, программа не проходит мимо конструкции на объекте WaveIn, и программа умирает с InvalidOperationException, который имеет сообщение "использовать WaveInEvent для записи в фоновом потоке". Может кто-то со знанием Наудио может сказать мне, что это значит? У меня есть попробовал вызвать функцию recordStuff () в собственном потоке, но в итоге получил тот же результат.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using NAudio.Wave;

namespace SimpleWave
{
    class Recorder
    {
        public Recorder()
        {
            writer = new WaveFileWriter("C:UsersPaulDesktopyeah.wav", new NAudio.Wave.WaveFormat(44100, 1));
        }

        public static List<byte> buff = new List<byte>();
        public static WaveFileWriter writer;

        public void recordStuff()
        {
            // WaveIn Streams for recording
            WaveIn waveInStream;

            waveInStream = new WaveIn();
            waveInStream.DeviceNumber = 0;
            waveInStream.WaveFormat = new WaveFormat(44100, 2);
            writer = new WaveFileWriter(@"C:UsersPaulDesktopthis.wav", waveInStream.WaveFormat);

            waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable);
            waveInStream.StartRecording();
        }

        public void waveInStream_DataAvailable(object sender, WaveInEventArgs e)
        {
            writer.Write(e.Buffer, 0, e.BytesRecorded);
        }
    }
}

1 ответов


по умолчанию WaveIn конструктор использует сообщения Windows для обратных вызовов. Однако при запуске консольного приложения или из фонового потока эти сообщения Windows обрабатываться не будут. Самое простое решение-использовать класса.

waveInStream = new WaveInEvent();

еще одна проблема с вашим кодом заключается в том, что вам нужно сохранить waveInStream живой, пока вы не закончите запись (т. е. вам нужно будет позвонить StopRecording в какой-то момент), поэтому вы должны сделать waveInStream поле Recorder класса.