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
[C#] NAudio 各种常见使用方式 播放 录制 转码 音频可视化
NAudio - WaveOut 与 WaveOffsetStream 一起使用时不会引发 PlaybackStopped 事件