我的 NAudio 代码中都有哪些错误?

Posted

技术标签:

【中文标题】我的 NAudio 代码中都有哪些错误?【英文标题】:What are the errors in my code with NAudio?我的 NAudio 代码中有哪些错误? 【发布时间】:2018-11-24 13:14:34 【问题描述】:

有这样一个任务: 需要执行一个程序。该程序有一个文本框,并且能够打开文本文件并将文件中的文本粘贴到该文本框中。 此外,该程序应录制音频。为此,我使用 NAudio 库。 当您按 CTRL + 1 时,正在录制音频。当您按 CTRL + 2 时,停止录制。 每个文件都按记录号记录。每次输入后数字都会增加。 我正确地实现了程序,我从关于通过 NAudio 在 C# 中录制音频的文章中获取了 NAudio 的代码。按钮事件中有一个编写代码,但我实现了单独的方法。 因此,Visual Studio 会生成一个错误列表。 请帮我弄清楚。 表单文件代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using NAudio.Wave;
using NAudio.FileFormats;
using NAudio.CoreAudioApi;
using NAudio;
 
namespace RecordBooks

    public partial class Form1 : Form
    
        WaveIn waveIn;
        WaveFileWriter writer;
        string recordFile = "";
        int numberRecords = 0;
        public Form1()
        
            InitializeComponent();
            KeyPreview = true;
            KeyDown += Form1_KeyDown;
        
 
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        
            if (e.Control && e.KeyCode == Keys.D1)
            
                StartRecording();
            
            else if (e.Control && e.KeyCode == Keys.D2)
            
                if (waveIn != null)
                
                    StopRecording();
                
            
        
 
        void waveIn_DataAvailable(object sender, WaveInEventArgs e)
        
            if (this.InvokeRequired)
            
                this.BeginInvoke(new EventHandler<WaveInEventArgs>(waveIn_DataAvailable), sender, e);
            
            else
            
                writer.WriteData(e.Buffer, 0, e.BytesRecorded);
            
        
 
        void StartRecording()
        
            try
            
                waveIn = new WaveIn();
                waveIn.DeviceNumber = 0;
                waveIn.DataAvailable += waveIn_DataAvailable;
                waveIn.RecordingStopped += new EventHandler(waveIn_RecordingStopped);
                waveIn.WaveFormat = new WaveFormat(8000, 1);
                recordFile = numberRecords + ".wav";
                writer = new WaveFileWriter(recordFile);
                waveIn.StartRecording();
            
            catch (Exception ex)
            
                MessageBox.Show(ex.Message);
            
 
            void StopRecording()
            
                waveIn.StopRecording();
                numberRecords += 1;
            
 
            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;
                
            
 
            void menuNew_Click(object sender, EventArgs e)
            
                richTextBox1.Clear();
                numberRecords = 0;
            
 
            void menuExit_Click(object sender, EventArgs e)
            
                Application.Exit();
            
 
            void menuOpen_Click(object sender, EventArgs e)
            
                if (openFileDialog1.ShowDialog() == DialogResult.OK && openFileDialog1.FileName.Length > 0)
                
                    richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText);
                    numberRecords = 0;
                
            
 
            void menuSave_Click(object sender, EventArgs e)
            
                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                
                    richTextBox1.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.PlainText);
                
            
        
    

【问题讨论】:

能否请您显示您遇到的错误? i.paste.pics/2f7a200fbd070b1f2b0a616b29197dca.png 【参考方案1】:

您没有使用 关闭方法 StartRecording()。因此,以下所有方法都是 StartRecording 的本地方法,在外部不可见。

void StartRecording()

    try
    
        waveIn = new WaveIn();
        waveIn.DeviceNumber = 0;
        waveIn.DataAvailable += waveIn_DataAvailable;
        waveIn.RecordingStopped += new EventHandler(waveIn_RecordingStopped);
        waveIn.WaveFormat = new WaveFormat(8000, 1);
        recordFile = numberRecords + ".wav";
        writer = new WaveFileWriter(recordFile);
        waveIn.StartRecording();
    
    catch (Exception ex)
    
        MessageBox.Show(ex.Message);
    
  // <<<-- this was missing

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

【讨论】:

错误仍然存​​在 我更新了我的答案以更清楚。您是否收到相同的错误消息?如果它们现在不同,请发布新的(最好为此编辑您的问题而不是添加其他评论,也最好将错误消息添加为文本,而不是图片)。 错误 CS0029 无法将类型“System.EventHandler”隐式转换为“System.EventHandler”RecordBooks 错误信息还包括一个行号;并双击错误消息将使您进入 Visual Studio 代码编辑器中的违规行。大概就是这个:waveIn.RecordingStopped += new EventHandler(waveIn_RecordingStopped);;将其更改为 waveIn.RecordingStopped += waveIn_RecordingStopped; 并 alco 将 waveIn_RecordingStopped 的方法签名更正为 void waveIn_RecordingStopped(object sender, StoppedEventArgs e) CS0123 'waveIn_RecordingStopped' 没有重载匹配委托 'EventHandler' RecordBooks 第 86 行

以上是关于我的 NAudio 代码中都有哪些错误?的主要内容,如果未能解决你的问题,请参考以下文章

错误的 .wav 格式录制音频 NAudio 库

随着代码变得越来越复杂,都有哪些好的策略可以修复错误?

Android WebView 在开发过程中都有哪些坑

如何知道我的表中都有哪些属于 bigQuery 的长期存储?

在 PCA 之后找出我的组件中都有哪些功能

Naudio BadDeviceId 在 C# 中调用 waveInOpen 错误