You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:53:35