使用 NAudio,如何获取 MP3 文件的幅度和节奏?
Posted
技术标签:
【中文标题】使用 NAudio,如何获取 MP3 文件的幅度和节奏?【英文标题】:Using NAudio, How do I get the amplitude and rhythm of an MP3 file? 【发布时间】:2013-11-01 17:34:25 【问题描述】:妻子要求提供一种设备,让圣诞灯饰以最好的音乐“摇滚”。我将使用 Arduino 微控制器来控制连接到灯的继电器,从 C# winforms 发送 6 个信号来关闭和打开它们。我想用NAduio将幅度和节奏分开来发送六个信号。对于特定的赫兹范围,例如六个信号的六个小节的均衡器,然后是节奏的时间。我看过 WPF 演示,波形似乎是答案。我想知道如何在歌曲播放时实时获取这些值。 我在想 ... 1. 创建一个简单的 mp3 播放器并加载我所有的歌曲。 2. 开始播放歌曲。 3. 对歌曲的当前动态进行采样,并将其放入一个整数中,我可以通过 USB 将其发送到 Arduino 微控制器上的哪个通道。
我不确定如何实时捕获当前声音信息并为那一刻提供整数值。我可以在歌曲播放时实时读取 e.MaxSampleValues[0] 值,但我希望能够区分当时处于活动状态的频率范围。
对于这个有趣的项目,任何帮助或指导将不胜感激。
谢谢
【问题讨论】:
【参考方案1】:听起来像是一个有趣的信号处理项目。
使用NAudio.Wave.WasapiLoopbackCapture
对象,您可以获取本地计算机上的声卡产生的音频数据。这可以让您跳过“创建 MP3 播放器”步骤,尽管代价是声音和灯光之间的轻微延迟。为了获得更好的同步,您可以在播放期间进行 MP3 解码并预先计算节拍模式和输出状态。这将允许您调整发送输出和播放生成这些输出的音频块之间的延迟,从而在灯光和音乐之间获得近乎完美的同步。
获得样本后,下一步就是使用 FFT 来查找频率分量。幸运的是 NAudio
包含一个可以帮助解决此问题的类:NAudio.Dsp.FastFourierTransform
。 (谢谢 Mark!)获取 FFT()
函数的输出,并总结出每个受控灯所需的频率范围。
下一步是节拍检测。 here 上有一篇有趣的文章。主要区别在于,您将使用来自光谱分析阶段的数据来提供节拍检测算法,而不是对样本块流进行能量检测。您求和的这些范围成为单个节拍检测处理器的输入,为您定义的每个频率范围提供一个输出。您可能希望为每个频率组添加单独的缩放/阈值因子,并使用某种屏幕控件来调整这些因子以获得最佳效果。
在流程结束时,您将获得一个样本块流,每个样本块都有一组输出标志。将标志推送到您的 Arduino 并将样本排队播放,其中任何一个操作都有延迟以实现同步。
【讨论】:
以上是关于使用 NAudio,如何获取 MP3 文件的幅度和节奏?的主要内容,如果未能解决你的问题,请参考以下文章
如何在使用 NAudio 流式传输 mp3 时获取当前时间?