使用 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 时获取当前时间?

如何使用 Naudio 和 c# 修剪 mp3 帧的标题和边信息

Naudio:如何播放 MP3 和 WAV 文件?

使用 NAudio 修剪 mp3 文件

mp3 到样本数组 NAudio

如何使用内存流、NAudio 和 LameMP3 将音频 aiff 转换为 MP3