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

Posted

技术标签:

【中文标题】NAudio WaveFileWriter 不会将文件大小写入波形文件【英文标题】:NAudio WaveFileWriter doesn't write file size to wave file 【发布时间】:2020-10-22 08:38:39 【问题描述】:

我正在尝试使用 NAudio 在 C# 中使用 WasapiLoopbackCapture 和 WaveFileWriter 录制一些声音。

问题是录制完成后,WAV/RIFF头中的“size”字段设置为0,导致文件无法播放。

我正在使用以下代码:

    WasapiLoopbackCapture CaptureInstance = null;
    WaveFileWriter RecordedAudioWriter = null;
    void StartSoundRecord()
    

        string outputFilePath = @"C:\RecordedSound.wav";

        // Redefine the capturer instance with a new instance of the LoopbackCapture class
        CaptureInstance = new WasapiLoopbackCapture();

        // Redefine the audio writer instance with the given configuration
        RecordedAudioWriter = new WaveFileWriter(outputFilePath, CaptureInstance.WaveFormat);
        
        // When the capturer receives audio, start writing the buffer into the mentioned file
        CaptureInstance.DataAvailable += (s, a) =>
        
            // Write buffer into the file of the writer instance
            RecordedAudioWriter.Write(a.Buffer, 0, a.BytesRecorded);
        ;

        // When the Capturer Stops, dispose instances of the capturer and writer
        CaptureInstance.RecordingStopped += (s, a) =>
        
            RecordedAudioWriter.Dispose();
            RecordedAudioWriter = null;
            CaptureInstance.Dispose();
        ;

        // Start audio recording !
        CaptureInstance.StartRecording();

    

    void StopSoundRecord()
    
        if(CaptureInstance != null)
        
            CaptureInstance.StopRecording();
        
    

(借自:https://ourcodeworld.com/articles/read/702/how-to-record-the-audio-from-the-sound-card-system-audio-with-c-using-naudio-in-winforms)

我正在简单地测试:

    StartSoundRecord();
    Thread.Sleep(10000);
    StopSoundRecord();

我错过了什么,为什么 WaveFileWriter 不写入大小字段?在处理之前,我也尝试过调用 Flush() 和 Close() 方法。但这并没有什么区别。

当然,我可以编写一个方法来找出文件的大小并手动将其写入最终文件,但这似乎没有必要。

【问题讨论】:

【参考方案1】:

找到了解决办法。

在每次写入后调用 RecordedAudioWriter.Flush() 使其正常工作。

不知道这样做是否效率低下(因为我假设刷新会阻塞直到数据写入磁盘),但对于我的应用程序来说这不是问题。

【讨论】:

以上是关于NAudio WaveFileWriter 不会将文件大小写入波形文件的主要内容,如果未能解决你的问题,请参考以下文章

PCM Wave 文件中的数据长度使用 MemoryStream 和 WaveFileWriter

在 NAudio 中添加 WAV 标头

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

NAudio PlaybackState 永远不会停止?

NAudio - WaveOut 与 WaveOffsetStream 一起使用时不会引发 PlaybackStopped 事件

NAudio - 如何在结束后立即播放音频而不会有任何延迟?