NAudio最长可录制多长时间?如何设置延长录制时长至80分钟?
30分钟录制上限通常来自两个核心原因:一是传统WAV格式的32位长度字段限制,最大仅支持4GB文件,对应未压缩16位44.1kHz立体声约35分钟的音频,和常见的30分钟左右上限吻合;二是捕获端缓冲区配置不合理、录制逻辑存在误触发停止的条件。可通过以下配置调整解决:
采用支持大文件的写入逻辑
如果需要输出WAV格式,不要使用默认的WaveFileWriter,改用NAudio内置的WaveFileWriter.CreateWaveFile64方法生成64位长度字段的WAV文件,可突破4GB大小限制,完全覆盖80分钟的录制需求。如果对格式无强制要求,也可以边录制边写入MP3、AAC等压缩格式,大幅降低文件体积,从根源避免大小限制触发中断。调整环回捕获缓冲区配置
录制扬声器输出一般使用WasapiLoopbackCapture实现环回捕获,初始化时可显式指定更长的缓冲区时长,降低长时间录制下系统高负载导致的缓冲区溢出、录制中断概率,示例配置:var capture = new WasapiLoopbackCapture(TimeSpan.FromSeconds(2));
上述代码将默认100ms缓冲区调整为2秒,稳定性更高。检查录制逻辑与存储条件
首先排查代码中是否存在手动预设的30分钟停止阈值、内存占用阈值判断,避免误触发停止。录制过程中直接把捕获到的音频数据写入磁盘,不要全量缓存在内存中,防止内存溢出中断。同时确保存储录制文件的磁盘剩余空间大于10GB(未压缩16位44.1kHz立体声80分钟约占8GB空间),避免磁盘写满导致录制提前结束。
以下是可稳定实现80分钟录制的核心代码示例:
// 初始化扬声器环回捕获,设置2秒缓冲区 var capture = new WasapiLoopbackCapture(TimeSpan.FromSeconds(2)); // 使用64位WAV写入器,支持超过4GB的大文件 using (var writer = WaveFileWriter.CreateWaveFile64(@"D:\long_time_record.wav", capture.WaveFormat)) { // 捕获到音频数据时直接写入磁盘 capture.DataAvailable += (sender, args) => { writer.Write(args.Buffer, 0, args.BytesRecorded); }; // 启动录制 capture.StartRecording(); // 等待80分钟后停止录制 await Task.Delay(TimeSpan.FromMinutes(80)); capture.StopRecording(); }
内容的提问来源于stack exchange,提问作者H87

