使用NAudio录制声音并保存时程序挂断

问题描述 投票:2回答:1

我在使用NAudio保存录音时遇到了一些问题。大多数情况下,以下代码将起作用。按“开始记录”按钮后,它将开始记录并保存到.wav文件,而按“停止”按钮后,它将停止记录。但是有时,在我单击“录制”按钮后,该程序只是挂断了。我必须等待30秒钟左右才能开始正确录制。

    private WaveIn waveSource = null;
    private WaveFileWriter waveFile = null;

    private void recordButton_Click(object sender, EventArgs e)
    {
        recordButton.Enabled = false;
        stopRecordButton.Enabled = true;
        waveSource = new WaveIn();
        waveSource.WaveFormat = new WaveFormat(44100, 1);
        waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
        waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSouce_RecordingStopped);

        waveFile = new WaveFileWriter("test.wav", waveSource.WaveFormat);
        waveSource.StartRecording();
    }

    private void stopRecordButton_Click(object sender, EventArgs e)
    {
        stopRecordButton.Enabled = false;
        waveSource.StopRecording();
    }     

    private void waveSource_DataAvailable(object sender, WaveInEventArgs e)
    {
        if (waveFile != null)
        {
            waveFile.Write(e.Buffer, 0, e.BytesRecorded);
            waveFile.Flush();
        }
    }

    private void waveSouce_RecordingStopped(object sender, StoppedEventArgs e)
    {
        DisposeWave();
    }

    private void DisposeWave()
    {
        if (waveSource != null)
        {
            waveSource.Dispose();
            waveSource = null;
        }
        if (waveFile != null)
        {
            waveFile.Dispose();
            waveFile = null;
        }
    }

我在Visual Studio中设置了一个休息时间,发现它挂在了网上:waveSource.StartRecording();进入功能大约需要30秒:private void waveSource_DataAvailable()。

我也在另一台计算机上运行了该程序,但是单击“开始录制”按钮后,出现以下异常文本。我在那台计算机上检查了设备管理器,并且我确定声卡已正确安装。

************** Exception Text **************
NAudio.MmException: BadDeviceId calling waveInOpen
  at NAudio.Wave.WaveIn.OpenWaveInDevice()
  at NAudio.Wave.WaveIn.StartRecording()
  at ToeflSpeaking.MainForm.StartRecordingState() in c:\MyProgram\Toefl Speaking\code\MainForm.cs:line 268
  at ToeflSpeaking.MainForm.timer_Tick(Object sender, EventArgs e) in c:\MyProgram\Toefl Speaking\code\MainForm.cs:line 407
  at System.Windows.Forms.Timer.OnTick(EventArgs e)
  at System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
  at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
c# naudio
1个回答
0
投票

我正在控制台应用程序中使用相同的代码(如Vitali所建议的那样,但是我遇到的问题是,该代码大部分时间都可以正常工作,但是在某些情况下,没有字节记录,并且产生的输出流是null,在后端系统中创建异常和错误,我正在使用该异常和错误来处理接收到的音频。我希望有一种“控制”此方法的方法,但它似乎确实是随机发生的。这里有什么帮助吗?

© www.soinside.com 2019 - 2024. All rights reserved.