C# NAudio:如何访问 SignalGenerator 提供的样本以将它们保存为 WAVE 格式?

Posted

技术标签:

【中文标题】C# NAudio:如何访问 SignalGenerator 提供的样本以将它们保存为 WAVE 格式?【英文标题】:C# NAudio: How to access the samples provided by SignalGenerator in order to save them to WAVE format? 【发布时间】:2018-03-23 18:02:29 【问题描述】:

我有以下构造函数,它成功地将粉红噪声直接播放到我的音频输出设备:

public WAVEManager(string inputFileName, string outputFileName)

        IWavePlayer outputDevice;
        outputDevice = new WaveOutEvent();

        SignalGenerator pinkNoiseGenerator = new SignalGenerator();
        pinkNoiseGenerator.Type = SignalGeneratorType.Pink;
        outputDevice.Init(pinkNoiseGenerator);
        outputDevice.Play();

        // Wait for 10 seconds
        System.Threading.Thread.Sleep(10000);

这一切都很好。我知道现在如果我想写入 .wav,我必须像这样初始化 WaveFileWriter:

WaveFileWriter writer = new WaveFileWriter(outputFileName, pinkNoiseGenerator.WaveFormat);

然后写入创建的WAVE文件:

writer.WriteData(buffer, 0, numSamples);

问题在于我不知道如何直接从pinkNoiseGenerator 填充buffer。我已经搜索了文档和示例,但找不到与此有关的任何内容 - 我想它必须涉及 SignalGenerator 类的 .Read() 方法,但是由于生成器无限期地播放,它没有定义的长度。对我来说,这意味着buffer 不能像我们直接从输入 WAVE 文件中读取一样(据我所知)填充。

有人可以指点我正确的方向吗?

谢谢。

【问题讨论】:

【参考方案1】:

创建包含 10 秒粉红噪声的 WAV 文件的方法如下:

var pinkNoiseGenerator = new SignalGenerator();
pinkNoiseGenerator.Type = SignalGeneratorType.Pink;
WaveFileWriter.CreateWaveFile16("pinkNoise.wav", pinkNoiseGenerator.Take(TimeSpan.FromSeconds(10)));

【讨论】:

干杯!对于下一阶段,我实际上需要直接访问样本以将它们乘以可变增益因子。最有效的方法是在创建的 .wav 上使用 WaveFileReader,或者有没有办法在上述解决方案中作为中间步骤? 只需将信号发生器包装在VolumeSampleProvider 中...或者更简单,使用SignalGenerator 本身的Gain 属性

以上是关于C# NAudio:如何访问 SignalGenerator 提供的样本以将它们保存为 WAVE 格式?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# NAudio 操作字节?

C# NAudio 如何强制/硬编码音频设备(声卡)?

如何使用 Naudio 和 c# 修剪 mp3 帧的标题和边信息

在 WPF C# 中使用 NAudio 录制音频

NAudio C#:如何从 WaveInEventArgs 获取字节数组以进行进一步操作

C# NAudio 音量