C# Winform编程 NAudio 音频库

这篇具有很好参考价值的文章主要介绍了C# Winform编程 NAudio 音频库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

NAudio安装

项目=>NuGet包管理器 搜索NAudio点击安装,自动安装依赖库。
naudio音频库,C#,c#,音视频
安装成功后工具箱会新增NAudio.WinForms控件
naudio音频库,C#,c#,音视频

NAudio简述

NAudio为.NET平台下的开源库,采用ML-PL协议,开源地址:https://github.com/naudio/NAudio支持多种音频操作,可实现多种API播放与录制、多种不同音频格式、音频格式转换(重采样、位深、声道等)、音频编码、多通道播放、音频效果处理等等。

快速入门
深入研究

常用类:

  • WaveIn 表示波形输入, 继承了 IWaveIn, 例如麦克风输入, 或者计算机正在播放的音频流。
  • WaveOut 表示波形输出, 继承了 IWavePlayer, 用来播放音频, 以 IWaveProvider 作为播放源播放音频, 通过拓展方法也支持以 ISampleProvider 作为播放源播放音频。
  • WaveStream 表示波形流, 它继承了 IWaveProvider, 可以用来作为播放源。
  • WaveFileReader 继承了 WaveStream, 用来读取波形文件。
  • WaveFileWriter 继承了Stream, 用来写入文件, 常用于保存音频录制的数据。
  • AudioFileReader 通用的音频文件读取器, 可以读取波形文件, 也可以读取其他类型的音频文件例如 Aiff, MP3

常用接口:

  • IWaveProvider 波形提供者, 上面已经提到, 是音频播放的提供者, 通过拓展方法可以转换为 ISampleProvider。
  • ISampleProvider 采样提供者, 上面已经提到, 通过拓展方法可以作为 WaveOut 的播放源。

简单示例1

自定义录音机类:Recorder.cs

using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NAudioDemo
{
    internal class Recorder
    {
        public WaveIn mWaveIn;
        public WaveFileWriter mWaveFileWriter;
        public int secondsRecorded;

        /// <summary>
        /// 开始录音
        /// </summary>
        /// <param name="filePath"></param>
        public void RecorderStart(string filePath)
        {
            // 创建WaveIn对象
            mWaveIn = new WaveIn();

            // 添加DataAvailable事件处理回调
            mWaveIn.DataAvailable += OnDataAvailable;

            // 创建WaveFileWriter对象
            mWaveFileWriter = new WaveFileWriter(filePath, mWaveIn.WaveFormat);

            // 开始录音
            mWaveIn.StartRecording();
        }

        /// <summary>
        /// 停止录音
        /// </summary>
        public void RecorderStop()
        {
            mWaveIn?.StopRecording();

            mWaveIn?.Dispose();

            mWaveFileWriter?.Close();
            mWaveFileWriter = null;
        }


        /// <summary>
        /// 录音数据回调
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnDataAvailable(object sender, WaveInEventArgs e)
        {
            // 写入录音数据
            mWaveFileWriter.Write(e.Buffer, 0, e.BytesRecorded);           

            // 计算已录制的秒数
            secondsRecorded = (int)mWaveFileWriter.Length / mWaveFileWriter.WaveFormat.AverageBytesPerSecond;
        }
  
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


using System.IO;
using NAudio.Wave;
using System.Drawing.Text;
using System.Media;
using NAudio.Dsp;

namespace NAudioDemo
{
    public partial class Form1 : Form
    {             
        // 创建录音机类实例
        Recorder recorder = new Recorder();
        
        public Form1()
        {
            InitializeComponent();
        }
                
        private void Form1_Load(object sender, EventArgs e)
        {
            
        }
   
        private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            button2.Enabled = true;
            recorder.RecorderStart(@"D:\1.wav");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            button1.Enabled = true;
            button2.Enabled = false;
            recorder.RecorderStop();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            SoundPlayer player = new SoundPlayer(@"D:\1.wav");
            player.Play();           
        }
    }
}

naudio音频库,C#,c#,音视频

录制麦克风

  • 借助 WaveIn 类, 我们可以轻易的捕获麦克风输入, 在每一次录制到数据时, 将数据写入到文件或其他流, 这就实现了保存录音

  • 在保存波形文件时需要借助 WaveFileWriter, 当然, 如果你想保存为其他格式, 也可以使用其它的 Writer, 例如 CurWaveFileWriter 以及AiffFileWriter, 美中不足的是没有直接写入到 MP3 的 FileWriter

  • 需要注意的是, 桌面程序可以直接使用 WaveIn, 其回调基于 Windows 消息, 所以无法在控制台应用中使用 WaveIn

  • 如果要在控制台应用中实现录音, 只需要使用 WaveInEvent, 它的回调基于事件而不是 Windows 消息, 所以可以通用

  • 示例代码:
    WaveIn cap = new WaveIn(); // cap, capture
    WaveFileWriter writer = new WaveFileWriter();
    cap.DataAvailable += (s, args) => writer.Write(args.Buffer, 0, args.BytesRecorded); // 订阅事件
    cap.StartRecording(); // 开始录制
    cap.StopRecording(); // 停止录制
    writer.Close(); // 关闭 FileWriter, 保存数据

  • 另外, 除了使用 WaveIn, 你还可以使用 WasapiCapture, 它与 WaveIn 的使用方式是一致的, 可以用来录制麦克风

  • Wasapi 全称 Windows Audio Session Application Programming Interface (Windows音频会话应用编程接口)

  • 具体 WaveIn, WaveInEvent, WasapiCapture 的性能, 笔者还没有测试过, 但估计不会有太大差异.

  • 提示: WasapiCapture 和 WasapiLoopbackCapture 位于 NAudio.Wave 命名空间下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using NAudio;
using NAudio.Wave;


namespace NAudioDemo2
{
    public partial class Form2 : Form
    {

        private WaveIn waveIn = null;
        private WaveFileWriter writer = null;


        public Form2()
        {
            InitializeComponent();
            button2.Enabled = false;
            button3.Enabled = false;
        }

        /// <summary>
        /// 设置保存文件名称
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            saveFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            saveFileDialog1.Filter = "audio files (*.wav)|*.wav| all files (*.*)|*.*"; // 文件类型过滤
            saveFileDialog1.DefaultExt = "*.wav"; // 默认文件扩展名
            //saveFileDialog1.FileName = "1.wav"; // 默认文件名

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            { 
                string fName = saveFileDialog1.FileName; // 获取文件名
                textBox1.Text = fName;
                button2.Enabled = true;
            }
        }

        /// <summary>
        /// 开始录音
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
                      
            //waveIn = new WaveIn { WaveFormat = new WaveFormat(44100, 1) };
            waveIn = new WaveIn();
            waveIn.WaveFormat = new WaveFormat(44100, 1);
           
            writer = new WaveFileWriter(textBox1.Text.Trim(), waveIn.WaveFormat);

            waveIn.DataAvailable += (s, args) => writer.Write(args.Buffer, 0, args.BytesRecorded);

            waveIn.StartRecording();

            button2.Enabled = false;
            button3.Enabled = true;
        }

        /// <summary>
        /// 停止录音
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            waveIn.StopRecording();
            waveIn.Dispose();
            waveIn = null;

            writer.Flush();
            writer.Close();
            writer.Dispose();

            button2.Enabled = true;
            button3.Enabled = false;
        }
    }
}

录制系统声卡

录制声卡输出, 也就是录制计算机正在播放的声音, 借助 WasapiLoopbackCapture 即可简单实现, 使用方式与 WasapiCapture 无异
WasapiLoopbackCapture cap = new WasapiLoopbackCapture();
WaveFileWriter writer = new WaveFileWriter();
cap.DataAvailable += (s, args) => writer.Write(args.Buffer, 0, args.BytesRecorded);
cap.StartRecording();

using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace NAudioDemo2
{
    public partial class Form3 : Form
    {
        private WasapiLoopbackCapture loopCap = new WasapiLoopbackCapture();
        private WaveFileWriter fileWriter;

        public Form3()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Filter = "wave file *.wav|*.wav|all filse *.*|*.*";
            saveFileDialog.DefaultExt = ".wav";

            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                string fName = saveFileDialog.FileName;
                textBox1.Text = fName;            
            }
        }

        /// <summary>
        /// 录制声卡开始
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            fileWriter = new WaveFileWriter(textBox1.Text.Trim(), loopCap.WaveFormat) ;
            loopCap.DataAvailable += (s, args) => fileWriter.Write(args.Buffer, 0, args.BytesRecorded);

            loopCap.StartRecording();
        }

        /// <summary>
        /// 录制声卡停止
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            loopCap.StopRecording();
            fileWriter.Flush();
            fileWriter.Close();
            fileWriter.Dispose();
        }
    }
}

WAV格式播放

NAudio 中, 通过 WaveFileReader 来读取波形数据, 在实例化时, 你可以指定文件名或者是输入流, 这意味着你可以读取内存流中的音频数据.
WaveFileReader reader = new WaveFileReader(filepath);
WaveOut wout = new WaveOut();
wout.Init(reader); // 通过 IWaveProvider 为音频输出初始化
wout.Play(); // 至此, wout 将从指定的 reader 中提供的数据进行播放

using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace NAudioDemo2
{
    public partial class Form4 : Form
    {
        private WaveOut wout_wav;
        WaveFileReader reader;

        public Form4()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "audio file *.wav|*.wav";
            ofd.DefaultExt = "*.wav";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                string fName = ofd.FileName;
                textBox1.Text = fName;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            reader = new WaveFileReader(textBox1.Text.Trim());
            wout_wav = new WaveOut();
            wout_wav.Init(reader);
            wout_wav.Play();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            wout_wav.Pause();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            wout_wav.Resume();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            wout_wav.Stop();
            wout_wav.Dispose();
            reader.Close();
        }
    }
}

MP3格式播放

播放 MP3 音乐其实与播放波形音乐没有太大区别, 只不过将 WaveFileReader 换成Mp3FileReader 罢了
Mp3FileReader reader = new Mp3FileReader(filepath);
WaveOut wout = new WaveOut();
wout.Init(reader);
wout.Play();

using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace NAudioDemo2
{
    public partial class Form5 : Form
    {
        Mp3FileReader reader;
        WaveOut wout_mp3;

        public Form5()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "audio file *.mp3|*.mp3";
            ofd.DefaultExt = "*.mp3";

            if (ofd.ShowDialog() == DialogResult.OK)
            { 
                string fName = ofd.FileName;
                textBox1.Text = fName;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            reader = new Mp3FileReader(textBox1.Text);
            wout_mp3 = new WaveOut();
            wout_mp3.Init(reader);
            wout_mp3.Play();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            wout_mp3.Pause();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            wout_mp3.Resume();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            wout_mp3.Stop();
            wout_mp3.Dispose();
            reader.Close();
            reader.Dispose();
        }
    }
}

AudioFileReader读取播放音频

通过AudioFileReader读取音频文件可以播放.mp3, .wav, .flac等多种格式
AudioFileReader reader = new AudioFileReader (@“d:\1.mp3”);
WaveOut wout = new WaveOut ();
wout.Init(reader );
wout.Play();
wout.Pause();
wout.Resume();
wout.Stop();

using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace NAudioDemo2
{
    public partial class Form6 : Form
    {
        AudioFileReader reader;
        WaveOut wout;

        public Form6()
        {
            InitializeComponent();
        }

        private void Form6_Load(object sender, EventArgs e)
        {
        
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "audio file *.mp3|*.mp3|all files *.*|*.*";
            if (ofd.ShowDialog() == DialogResult.OK)
            { 
                string fName = ofd.FileName;
                textBox1.Text = fName; 
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            reader = new AudioFileReader(textBox1.Text.Trim());
            wout = new WaveOut();
            wout.Init(reader);
            wout.Play();

        }

        private void button3_Click(object sender, EventArgs e)
        {
            wout.Pause();  
        }

        private void button4_Click(object sender, EventArgs e)
        {
            wout.Resume();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            wout.Stop();
            wout.Dispose();
            reader.Close();
            reader.Dispose();
        }
    }
}

MediaFoundationReader 读取播放音频

通过MediaFoundationReader 读取音频文件可以播放.mp3, .wav, .flac等多种格式
MediaFoundationReader reader = new MediaFoundationReader (@“d:\1.mp3”);
WaveOut wout = new WaveOut ();
wout.Init(reader );
wout.Play();
wout.Pause();
wout.Resume();
wout.Stop();文章来源地址https://www.toymoban.com/news/detail-816360.html

using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace NAudioDemo2
{
    public partial class Form7 : Form
    {
        MediaFoundationReader reader;
        WaveOut wout;

        public Form7()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog  ofd = new OpenFileDialog();
            ofd.Filter = "audio file *.mp3|*.mp3|all files *.*|*.*";
            ofd.DefaultExt = "*.mp3";

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                string fName = ofd.FileName;
                textBox1.Text = fName;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            reader = new MediaFoundationReader(textBox1.Text.Trim());
            wout = new WaveOut();
            wout.Init(reader);
            wout.Play();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            wout.Pause();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            wout.Resume();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            wout.Stop();
            wout.Dispose();
            reader.Close();
            reader.Dispose();
        }
    }
}

到了这里,关于C# Winform编程 NAudio 音频库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 音视频开发—MediaPlayer音频与视频的播放介绍

    Android多媒体中的——MediaPlayer,我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码和播放音视频。 它支持三种不同的媒体来源: 本地资源 内部的URI,比如你可以通过ContentResolver来获取 外部URL(流

    2024年02月10日
    浏览(61)
  • 音视频开发:音频编码原理+采集+编码实战

    消除冗余信息,压缩量最大,也叫有损压缩 剔除人耳听觉范围外的音频信号20Hz以下和20000Hz以上; 去除被掩蔽的音频信号,信号的遮蔽可以分为频域遮蔽和时域遮蔽; 频域遮蔽效应 屏蔽70分贝以下,20HZ以下,20000HZ以上 屏蔽分贝小,频率小的声音 两个频率相近发出的声音,

    2024年02月05日
    浏览(61)
  • 【音视频 | AAC】AAC格式音频文件解析

    😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭 🤣本文内容🤣:🍭介绍AAC格式音频文件解析🍭 😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭 本文未经允许,不得转发!!

    2024年02月04日
    浏览(54)
  • 音视频八股文(11)-- ffmpeg 音频重采样

    所谓的重采样,就是改变⾳频的采样率、sample format、声道数等参数,使之按照我们期望的参数输出。 为什么要重采样?当然是原有的⾳频参数不满⾜我们的需求,⽐如在FFmpeg解码⾳频的时候,不同的⾳源有不同的格式,采样率等,在解码后的数据中的这些参数也会不⼀致(最

    2024年02月04日
    浏览(102)
  • 音视频剪辑|FFMPEG|windows10下的音视频格式转换,遮挡填充,GIF动图制作,背景音频抽取,替换

    最近对于音视频和图像的处理问题比较感兴趣,但发现很多目前需要的功能要么需要付费但不会过于麻烦,要么比较麻烦,很可能某个功能实现需要安装很多软件 例如,视频转GIF动图,该功能的实现要么使用Photoshop全家桶,要么找在线网站,或者是wps充会员,或者找其它方法

    2024年02月20日
    浏览(59)
  • Qt 多媒体音频模拟按钮发音(音视频启动)

    ## 项目演示 平台 :windows或者ubuntu  要求 :平台需要支持音频播放功能 文件格式 :.wav 可以使用剪映生成,音频部分,我这里是简短的音乐 # Qt 多媒体简介 Qt QSound是Qt框架中的一个类,用于播放音频文件。它可以在Qt应用程序中实现简单的音频播放功能,包括播放、暂停和停

    2024年02月03日
    浏览(53)
  • Android音视频处理技术:音频混音与播放

    作者:禅与计算机程序设计艺术 在现代生活中,我们都会听到各种各样的声音。但是有的声音会相互抵消影响我们的正常生活,而有的声音则会增加我们的情绪快乐。人类为了能够真正体验到声音带来的快感,需要将不同类型的声音合并,再将它们再传达给大脑。音频混音与

    2024年02月08日
    浏览(44)
  • qt+ffmpeg 实现音视频播放(二)之音频播放

    通过  avformat_open_input () 打开媒体文件并分配和初始化  AVFormatContext   结构体。 函数原型如下: int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); 参数说明: - `ps`:指向 `AVFormatContext` 结构体指针的指针,用于存储打开的媒体文件的信息。

    2024年04月22日
    浏览(57)
  • 音视频开发系列(10):基于qt的音频推流

    今天分享一下利用qt录制音频,然后再利用ffmpeg推流到nginx服务器,最后再利用vlc进行拉流的demo。 首先介绍一下如何利用qt来进行音频的录制,qt的音频录制主要利用qt的QAudioFormat先进行音频信息的配置。主要需要配置以下的信息: 然后使用QAudioDeviceInfo来获取是否支持改设置

    2024年02月02日
    浏览(60)
  • 【音视频处理】音频编码AAC详解,低码率提高音质?

    大家好,欢迎来到停止重构的频道。 本期我们介绍 音频编码格式AAC 。 AAC是音频最常用的编码格式之一 ,几乎所有的播放器都支持这个编码格式。 其他音频编码格式都是类似的,只是某些细节存在差别,如压缩算法、某些音频参数存在限制等。 我们按这样的顺序讨论 :

    2024年02月09日
    浏览(90)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包