C#播放音频的正确姿势:NAudio的简介与基础播放
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
前言各网查了一圈,NAudio相关中文资料较少。鉴于本人最近在使用此库的播放音频方面有所涉及,在此将自己的学习过程与经验总结与大家分享,同时也欢迎大佬探讨和指正。 简介为什么使用NAudioNAudio为.NET平台下的开源库,采用ML-PL协议,开源地址:https://github.com/naudio/NAudio。截至今日,已有约2.4k的stars。 NAudio功能强大,且其入门容易。 强大在于:它支持许多音频操作,可实现多种API播放与录制、多种不同音频格式、音频格式转换(重采样、位深、声道等)、音频编码、多通道播放、音频效果处理等等(详细介绍可以看Github readme)。
Demo来自于官方Readme 另一方面,基于NAudio本身的架构值得学习 其框架系统、完善,但实际开箱即用的功能并不是十分的齐全(相对于Bass),对于一个喜爱倒腾的人来说,容易激发学习研究的兴趣,其官方教程与例子很是齐全。 快速入门:https://github.com/naudio/NAudio#tutorials 深入学习:https://markheath.net/category/naudio(作者博客) 与其他播放方式对比基于使用角度考虑,NAudio的优势在于,它是一个原生的.NET轻量库(其底层与其他API交互,但透明于使用者)。在不需要COM、独立SDK、手动P/Invoke的同时,对于音频交互更加可控、并且可以完成比以上更加复杂的功能。当然其也有一定的不足,例如目前无法跨平台,底层API强依赖于Windows(作者表示期待.NET Core的Span<T>的后续发展,时机成熟会考虑跨平台)。 目前常见的播放方案:
还有很多未列出。 例1:制作一个简易的音乐播放器目标:制作一个Winform的音乐播放器,仅实现读取mp3、播放、暂停、停止、进度拖动及显示、音量控制功能。 为了直观的展示,本例将弱化OOP封装思想。 回顾开篇的代码:
显然,这只能完成最基础的播放功能。而且对于一个GUI播放器而言,这样做会带来很多问题。 首先它会在播放时阻塞线程,其次当播放完毕就会立刻释放资源,无法对其进行任何控制。 针对以上缺陷完善代码:
以上完成了一个可以打开文件、播放、暂停、停止、释放资源的基础功能播放器。接下来完善一下进度显示以及进度调整。
以上完成了进度显示以及进度调整,里面包含了一些UI上的优化后的交互逻辑。其中涉及到了个人常用的Task / Cancellation的线程模式,可用Timer代替。 那么最后一个功能,如何进行音量控制?事实上,IWavePlayer接口包含了Volume这个属性,所以如果仅仅要达成这个目标十分简单,只需进行属性设置即可:
然而,这样做法并不推荐,因为对于内部的WaveOutEvent等IWavePlayer实现,实际效果是从改变了系统的合成器中的音量,如图: 也就意味着,这将改变整个应用程序的音量,不利于之后进行程序内部混音。 那将如何实现内部音量处理呢?这就涉及了DSP音频处理。在NAudio中,通过实现接口ISampleProvider,得到WaveStream提供音频原始数据并且进行处理,再将处理后的数据返回。将多个ISampleProvider链接起来进行顺序处理,最终将最外层的ISampleProvider交给IWavePlayer进行初始化Init()这样的一个处理模式。也就是说,其实基于上面的代码来看,AudioFileReader本身既是WaveStream,也实现了ISampleProvider。
说了这么多有点绕口,用简洁的方法表示,就是将之前的 在NAudio内置提供的DSP中,实现了音量处理相关的类VolumeSampleProvider,因此直接拿来用即可。 以上内容推荐结合NAudio源码食用 根据以上所述,更新代码:
这样就对原始音频进行了处理(改变音量),然后输出。 完成后的全部代码:
这样本例目标功能就实现完毕了,能实现最基础但是同时也可靠的音频播放功能。 注(坑):
相关源代码会随着本系列进行更新(如果不鸽): 顺便宣传一下个人在应用的一个NAudio相关的开源项目: 参考: 该文章在 2025/4/30 9:33:22 编辑过
|
关键字查询
相关文章
正在查询... |