C# NAudio:如何获取SignalGenerator样本并保存为WAV格式
解决粉红噪声写入WAV文件的问题
嘿,我明白你的困惑了!其实SignalGenerator实现了IWaveProvider接口,它的Read()方法就是用来生成并返回音频数据的——哪怕它是“无限”的,我们完全可以自己控制读取的时长,从而生成固定长度的WAV文件。
下面是具体的实现思路和代码示例:
核心思路
- 先确定你要生成的音频时长(比如你之前用到的10秒),根据
SignalGenerator的WaveFormat计算出需要写入的总字节数。 - 创建一个固定大小的缓冲区(比如4096字节),循环调用
SignalGenerator.Read()填充缓冲区,再把缓冲区的数据写入WaveFileWriter。 - 累计写入的字节数,直到达到预设的总字节数就停止循环,最后自动释放资源。
完整代码示例
public WAVEManager(string inputFileName, string outputFileName) { // 初始化粉红噪声生成器 SignalGenerator pinkNoiseGenerator = new SignalGenerator(); pinkNoiseGenerator.Type = SignalGeneratorType.Pink; var waveFormat = pinkNoiseGenerator.WaveFormat; // 设定要生成的音频时长(这里沿用你之前的10秒) int durationSeconds = 10; long totalBytesToWrite = (long)waveFormat.AverageBytesPerSecond * durationSeconds; long bytesWritten = 0; // 使用using语句自动释放WaveFileWriter资源 using (WaveFileWriter writer = new WaveFileWriter(outputFileName, waveFormat)) { // 定义缓冲区大小(可根据需求调整,推荐用2的幂数如4096、8192) byte[] buffer = new byte[4096]; while (bytesWritten < totalBytesToWrite) { // 从生成器读取数据填充缓冲区 int bytesRead = pinkNoiseGenerator.Read(buffer, 0, buffer.Length); if (bytesRead == 0) break; // 理论上SignalGenerator不会返回0,做个兜底判断 // 将缓冲区数据写入WAV文件 writer.Write(buffer, 0, bytesRead); bytesWritten += bytesRead; } } // 如果仍需要播放功能,可保留以下代码 // IWavePlayer outputDevice = new WaveOutEvent(); // outputDevice.Init(pinkNoiseGenerator); // outputDevice.Play(); // System.Threading.Thread.Sleep(10000); // outputDevice.Stop(); // outputDevice.Dispose(); }
关键说明
SignalGenerator.Read()方法会按需生成音频数据,哪怕它没有“固定长度”,我们通过控制累计写入的字节数,就能精准得到指定时长的音频文件。using语句能确保WaveFileWriter在使用完毕后自动释放,避免文件被占用的问题。- 缓冲区大小可以灵活调整,选择2的幂数是因为大部分音频处理场景下这类大小的效率更高。
这样就能顺利把粉红噪声写入WAV文件啦!
内容的提问来源于stack exchange,提问作者Mick McCarthy
相关产品推荐
相关产品推荐

