C# で NAudio を使用して音声を録音しようとしていますが、2 つの場所で立ち往生しています。
1. A crash:
THIS SOページのコードを少し変更すると、 NullReferenceException
. クラッシュログは次のとおりです。
************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object.
at NAudio.Wave.WaveIn.Callback(IntPtr waveInHandle, WaveMessage message, IntPtr userData, WaveHeader waveHeader, IntPtr reserved)
at NAudio.Wave.WaveWindow.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
コードは次のとおりです。
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)
{
init();
Application.Run();
}
public static void record()
{
while (true)
{
Console.WriteLine("Hit Enter to START Recording.\n");
Console.ReadLine();
s_WaveIn.StartRecording();
Console.WriteLine("Hit Enter to STOP recording.\n");
Console.ReadLine();
s_WaveIn.StopRecording();
}
}
public static void DeviceInit(int rate, int channels)
{
s_WaveIn = new WaveIn();
s_WaveIn.WaveFormat = new WaveFormat(rate, channels);
s_WaveIn.BufferMilliseconds = 1000;
s_WaveIn.DataAvailable += new EventHandler<WaveInEventArgs>(SendCaptureSamples);
}
public static void init()
{
DeviceInit(44100, 2);
Thread t1 = new Thread(delegate() {
record();
});
t1.Start();
}
static void SendCaptureSamples(object sender, WaveInEventArgs e)
{
Console.WriteLine("Bytes recorded: {0}", e.BytesRecorded);
}
}
ほとんどの場合、これは 3 回目の録音を開始したときに発生します。何がこれを引き起こしているのでしょうか?
*2. Modifying rate and channels at runtime.*
私の実際のコードでは、 をs_WaveIn.WaveFormat = new WaveFormat(new_rate, new_channels);
呼び出す前に使用して波形フォーマットをリセットしていますStartRecording()
。Dispose()
コールバックをリセットする必要があるため、呼び出していません。そのためDataAvailable
には、別のメッセージ ループが必要です。このアプローチは正しいですか、それとも最初に Dispose を呼び出してから、新しい形式で s_WaveIn を再初期化する必要がありますか?
ありがとうございました。