C# NAudio:录制的文件无法播放

Posted

技术标签:

【中文标题】C# NAudio:录制的文件无法播放【英文标题】:C# NAudio: Recorded file wont play 【发布时间】:2015-09-01 13:34:22 【问题描述】:

我正在尝试录制我的声音,在停止录制时,会弹出一个保存文件对话框。我可以这样做并将其保存到我的桌面进行播放。不幸的是,Groove 无法识别该文件(说明它无法播放),我很肯定这不是他们的错。

请原谅 cmets 和代码转储。

public partial class RecordAndEditVoice : Window

 WaveIn sourceStream = null;
    WaveFileWriter waveWriter = null;
      SaveFileDialog save = new SaveFileDialog();

     private void sourceStream_DataAvailable(object sender, WaveInEventArgs e)
    
        if (waveWriter == null) return;
        //Adds bytes to the wave file, storing them in a buffer? 
        waveWriter.Write(e.Buffer, 0, e.BytesRecorded);
        waveWriter.Flush();
    

    private void recordButton_Click(object sender, RoutedEventArgs e)
    


        MainWindow mw = new MainWindow();
        int devNum = mw.DeviceButton();

        if (recordButton.Content.ToString() == "RECORD")
        
            recordButton.Content = "STOP";
            //Start recording audio. 
            sourceStream = new WaveIn();

            sourceStream.DeviceNumber = devNum;

            //1. Set the sample rate. 2. Get number of channels supported on the device.
            sourceStream.WaveFormat = new WaveFormat(44100, WaveIn.GetCapabilities(devNum).Channels);



            sourceStream.StartRecording();

            sourceStream.DataAvailable += new EventHandler<WaveInEventArgs>(sourceStream_DataAvailable);


        
        else if(recordButton.Content.ToString() == "STOP")
        

            sourceStream.StopRecording();
            save.Filter = "Wave Files (*.wav)|*.wav;";
            if (save.ShowDialog() != true) return;

            waveWriter = new WaveFileWriter(save.FileName, sourceStream.WaveFormat);


            recordButton.Content = "RECORD";



        
    

我尝试将 waveWriter 移动到 if 语句中,但它会引发“System.ArgumentException”类型的异常。当用谷歌搜索时,它被引用得太广泛而没有多大帮助。

【问题讨论】:

问题可能是您在连接DataAvailable 事件之前调用了StartRecording?因为也许您在事件连接之前的最初几毫秒内丢失了一些数据,足以破坏文件?只是在黑暗中拍摄。 @ChrisDunaway 很遗憾没有,只是测试了一下。 :// 【参考方案1】:

在获得可播放文件之前,您必须在 WaveFileWriter 上调用 Dispose。这是因为WAV文件格式在文件开头包含一些长度信息,只有在调用Dispose时才会填写

【讨论】:

嗨,马克,感谢您的回复。你有更多关于 Dispose 的信息吗? 你需要在停止录制后调用它。最好的方法实际上是处理 Recording 停止事件,以防在调用 StopRecording 后触发任何最后的 DataAvailables

以上是关于C# NAudio:录制的文件无法播放的主要内容,如果未能解决你的问题,请参考以下文章

NAudio WaveFileWriter 不会将文件大小写入波形文件

NAudio Asio 录制播放和保存(仅限噪音)

无法使用麦克风 c# naudio 捕捉 15k 的音调

[C#] NAudio 各种常见使用方式 播放 录制 转码 音频可视化

用 NAudio 录制音频让我无法接受

使用 NAudio 无法正确生成方波