• c# 窗体 录制音频文件程序


    .NET的音频处理类库 NAudio

    是一款开源的用于.NET平台下的音频处理类库,提供了很多方法来操控音频数据。

    NAudio类库在VS2017版本上NuGet包下载并引用到项目。

     

    我做了一个音频录制程序,特别简单,效果图如下

    点击开始录制,程序运行时在特定的文件目录中生成一个.wav音频文件,停止录制后就可以查看录制的音频了

    在这个程序例子中,你将看到如何创建一个非常简单的WinForms应用程序,将音频记录到WAV文件中。

    首先,选择录制音频的放置位置。它将转到桌面上文件夹中调用recorded.wavNAudio文件:

    var outputFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "NAudio");
                Directory.CreateDirectory(outputFolder);
                var outputFilePath = Path.Combine(outputFolder, "recorded.wav");
    View Code 

    接下来,创建录制设备。我将WaveInEvent在这种情况下使用也可以使用WaveIn或确实使用WasapiCapture

    var  waveIn  =  new  WaveInEvent();

    我会声明一个WaveFileWriter但是在开始录制之前它不会被创建:

    WaveFileWriter  writer  =  null ;
    

      

    设置窗体。它将有两个按钮。一个启动,一个停止录制。声明一个closing标志,以便我们在窗体关闭时停止录制。

    现在需要一些事件处理程序。当我们点击时Record,程序将创建一个新的WaveFileWriter,指定要创建的WAV文件的路径和我们正在录制的格式。

    这必须与录制设备格式相同,因为程序将接收录制数据的格式,所以我们用waveIn.WaveFormat

    然后开始录制waveIn.StartRecording()并适当地设置按钮启用状态。

    private void btnstart_Click(object sender, EventArgs e)
            {
               writer = new WaveFileWriter(outputFilePath, waveIN.WaveFormat);
                waveIN.StartRecording();
                label1.Enabled = true;
                timer1.Start();
                btnstart.Enabled = false;
                btnstop.Enabled = true;
             }
     

    我们还需要DataAvailable输入设备上事件处理程序这将在我们开始录制后定期开始。我们可以将事件args中的缓冲区写入编写器。确保你写a.BytesRecorded字节,而不是a.Buffer.Length

    waveIn.DataAvailable  + =(s,a)=>
    {
         writer.Write(a.Buffer, 0, a.BytesRecorded);
    };
    

      

    我经常在录制WAV时添加的一个安全功能是限制WAV文件的大小。它们快速增长,无论如何都不能超过4GB。在这里,我要求录音在60秒后停止:

     waveIN.DataAvailable += (s, a) =>
                {
                    writer.Write(a.Buffer, 0, a.BytesRecorded);
                    if (writer.Position > waveIN.WaveFormat.AverageBytesPerSecond * 60)
                    {
                        waveIN.StopRecording();
                        label1.Enabled = false;
                        timer1.Stop();
                        label1.Hide();
                    }
                };
     

    现在需要处理停止录制按钮。这很简单,我们只是打电话waveIn.StopRecording()但是,我们可能仍会在DataAvailable回调中收到更多数据,所以不要再处理你WaveFileWriter

    waveIN.StopRecording();
    

     

    我们还将添加一个安全措施,如果您在录制时尝试关闭窗体,我们将调用StopRecording并设置一个标志,以便我们知道我们也可以处理输入设备:

                    if (closing)
                    {
                        waveIN.Dispose();
                    }

    为了安全地处理WaveFileWriter(我们需要做的是为了生成有效的WAV文件),应该RecordingStopped在我们的录制设备上处理该事件。我们DisposeWaveFileWriter它修正了头在我们的WAV文件,以便它是有效的。然后我们设置按钮状态。最后,如果我们关闭窗体,则应该处理输入设备。

     waveIN.RecordingStopped += (s, a) =>
                {
                    writer?.Dispose();
                    writer = null;
                    btnstart.Enabled = true;
                    btnstop.Enabled = false;
                    if (closing)
                    {
                        waveIN.Dispose();
                    }
                };
     
    推荐一个七夕福利——女朋友3D相册链接女朋友3D魔方相册链接
    https://www.cnblogs.com/wl192/p/11511200.html

     

  • 相关阅读:
    qt5--创建控件的两种方式
    qt5-编码转换
    C++qt助手assistant
    C++opencv绘制几何图形
    C++opencv创建图像
    【全球软件大会】华为前端工程师分享:华为云官网的智能化实践
    图解 Redis丨这就是 RDB 快照,能记录实际数据的
    云小课 | 玩转HiLens Studio之快速订购HiLens Studio版本
    带你认识4种设计模式:代理模式、装饰模式、外观模式和享元模式
    线性表、顺序表和链表,你还分不清?
  • 原文地址:https://www.cnblogs.com/wl192/p/11231008.html
Copyright © 2020-2023  润新知