如何从NAudio释放文件

时间:2018-11-27 11:45:43

标签: c# naudio

有一个已开发的程序。 该程序使用NAudio录制和播放音频。 当您按CTRL + 1时,应该开始记录,而CTRL + 2停止记录,CTRL + 3播放文件,而CTRL + 4删除最后一个文件。 删除的结果是文件正在忙于该过程的错误。 据我了解,NAudio不会在录制后释放文件,因此,我无法删除该文件。

public partial class Form1 : Form
{
    WaveIn waveIn;
    WaveFileWriter writer;
    string recordFile = "0.wav";
    int numberRecords = 0;
    public Form1()
    {
        InitializeComponent();
        KeyPreview = true;
        KeyDown += Form1_KeyDown;
    }

    void waveIn_DataAvailable(object sender, WaveInEventArgs e)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new EventHandler<WaveInEventArgs>(waveIn_DataAvailable), sender, e);
        }
        else
        {
                writer.Write(e.Buffer, 0, e.BytesRecorded);
        }
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.D1)
        {
            Thread.Sleep(500);
            StartRecording();
        }
        else if (e.Control && e.KeyCode == Keys.D2)
        {
            if (waveIn != null)
            {
                StopRecording();
            }
        }
        else if (e.Control && e.KeyCode == Keys.D3)
        {
            WaveStream mainOutputStream = new WaveFileReader(recordFile);
            WaveChannel32 volumeStream = new WaveChannel32(mainOutputStream);

            WaveOutEvent player = new WaveOutEvent();

            player.Init(volumeStream);
            player.Play();
        }
        else if (e.Control && e.KeyCode == Keys.D4)
        {
            if (File.Exists(recordFile))
            {
                File.Delete(recordFile);
                numberRecords -= 1;
                    }
        }
    }

    void StartRecording()
    {
        recordFile = Convert.ToString(numberRecords) + ".wav";
        try
        {
            waveIn = new WaveIn();
                waveIn.DeviceNumber = 0;
                waveIn.DataAvailable += waveIn_DataAvailable;
                waveIn.RecordingStopped += waveIn_RecordingStopped;
                waveIn.WaveFormat = new WaveFormat(44100, 1);
                writer = new WaveFileWriter(recordFile, waveIn.WaveFormat);
                waveIn.StartRecording();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    void StopRecording()
    {
        waveIn.StopRecording();
        numberRecords += 1;
    }

    private void waveIn_RecordingStopped(object sender, EventArgs e)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new EventHandler(waveIn_RecordingStopped), sender, e);
        }
        else
        {
            waveIn.Dispose();
            waveIn = null;
            writer.Close();
            writer = null;
        }
    }

0 个答案:

没有答案