8

私はNAudioを初めて使用し、マイクからのオーディオを録音してWaveファイルに書き込む小さなプログラムを作成しようとしています。プログラムのMain関数でrecordStuff()関数を呼び出すと、プログラムはWaveInオブジェクトの構成を通過せず、プログラムは「WaveInEventを使用してバックグラウンドスレッドに記録する」というメッセージを含むInvalidOperationExceptionで終了します。 。NAudioの知識がある人は、これが何を意味するのか教えてもらえますか?独自のスレッドで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:\\Users\\Paul\\Desktop\\yeah.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:\Users\Paul\Desktop\this.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);
        }
    }
}
4

1 に答える 1

15

デフォルトのWaveInコンストラクターは、コールバックにWindowsメッセージを使用します。ただし、コンソールアプリを実行している場合、またはバックグラウンドスレッドから実行している場合、これらのWindowsメッセージは処理されません。最も簡単な解決策は、WaveInEvent代わりにクラスを使用することです。

waveInStream = new WaveInEvent();

コードのもう1つの問題は、記録が完了するまで生き続ける必要があることです(つまり、ある時点でwaveInStream呼び出すことができる必要があります)。そのため、クラスのフィールドを作成する必要があります。StopRecordingwaveInStreamRecorder

于 2013-01-14T06:52:57.470 に答える