基于NAudio的C#音频项目:求播放前调整WAV读取流的可行示例
嘿,我给你整理了一个完整可运行的NAudio示例,刚好能实现你想要的WAV流读取后、输出到声卡前调整音频的需求,你可以直接在Visual Studio里测试:
NAudio WAV音频流实时调整示例
准备工作
- 先在Visual Studio里创建一个控制台应用(.NET Framework/.NET 5+都兼容)
- 通过NuGet安装NAudio包:可以在包管理器控制台输入
Install-Package NAudio,或者在NuGet包管理器界面搜索“NAudio”安装
完整可运行代码
using NAudio.Wave; using System; namespace NAudioAudioProcessingDemo { class Program { static void Main(string[] args) { // 替换成你本地的WAV文件路径 string wavFilePath = @"C:\test-audio.wav"; try { // 1. 读取WAV音频文件,自动处理格式 using var audioFileReader = new AudioFileReader(wavFilePath); // 2. 接入自定义音频处理流(这里以50%音量为例) var audioProcessor = new CustomAudioProcessor(audioFileReader, 0.5f); // 3. 初始化音频输出设备并播放 using var waveOut = new WaveOutEvent(); waveOut.Init(audioProcessor); waveOut.Play(); Console.WriteLine("音频正在播放,按任意键停止..."); Console.ReadKey(); } catch (Exception ex) { Console.WriteLine($"运行出错: {ex.Message}"); } } } // 自定义音频处理类,实现ISampleProvider接口来处理实时音频流 public class CustomAudioProcessor : ISampleProvider { private readonly ISampleProvider _sourceStream; private float _volume; public CustomAudioProcessor(ISampleProvider sourceStream, float initialVolume) { _sourceStream = sourceStream ?? throw new ArgumentNullException(nameof(sourceStream)); Volume = initialVolume; } // 可动态调整的音量属性,范围0(静音)到1(原音量) public float Volume { get => _volume; set => _volume = Math.Clamp(value, 0f, 1f); // 确保音量不会超出合理范围 } // 音频格式和源流保持一致 public WaveFormat WaveFormat => _sourceStream.WaveFormat; // 核心处理方法:读取音频样本并应用自定义逻辑 public int Read(float[] buffer, int offset, int count) { // 先从源流获取原始音频样本 int samplesRead = _sourceStream.Read(buffer, offset, count); // 对每个样本应用处理逻辑(这里是音量调整,你可以替换成其他需求) for (int i = offset; i < offset + samplesRead; i++) { // 音量调整 buffer[i] *= _volume; // 示例:如果要反转波形,取消下面注释 // buffer[i] = -buffer[i]; // 示例:如果要添加简单失真效果,取消下面注释 // buffer[i] = Math.Sign(buffer[i]) * (1f - (float)Math.Exp(-Math.Abs(buffer[i]) * 5)); } return samplesRead; } } }
代码关键点说明
- AudioFileReader:NAudio封装的便捷类,支持读取WAV、MP3等多种音频格式,自动处理音频格式转换,不用手动解析文件头。
- ISampleProvider:NAudio处理PCM音频的核心接口,通过实现它可以插入任意自定义音频处理逻辑,比如音量、均衡、音效等。
- CustomAudioProcessor:我们自定义的处理类,你可以根据需求修改
Read方法里的样本处理逻辑,比如添加降噪、音调调整、混响等。 - WaveOutEvent:适合控制台或非UI线程的音频输出类,不需要绑定UI控件,启动和停止都很方便。
扩展提示
- 如果需要调整音频的音调或播放速度,可以安装
NAudio.SoundTouch包,使用SoundTouchSampleProvider来实现。 - 如果是WinForms/WPF应用,可以用
WaveOut或DirectSoundOut替代WaveOutEvent,配合滑块等UI控件动态调整音量或其他参数。
内容的提问来源于stack exchange,提问作者TaterKing
相关产品推荐
相关产品推荐

