【问题标题】:MP3 Audio Spectrogram?MP3 音频频谱图?
【发布时间】:2013-11-21 04:09:12
【问题描述】:

整天都在寻找一种方法来做到这一点,没有希望。 我正在创建一个具有 MP3 播放功能的项目,我正在尝试包含一个类似于 http://puu.sh/4lkMn.png (Winamp) 的频谱图(或频谱分析仪..不确定它的正确名称)(尽管如果它不在酒吧,那也很好)

我目前一直在使用 WMP 进行音频播放,但 WMP 没有任何绘制频谱图的方法。

我研究过使用 NAudio,这似乎很有希望:http://naudio.codeplex.com/ 他们有频谱分析仪的演示,但没有提供该演示的源代码。

我还研究了这个http://wpfsvl.codeplex.com/,它使用 NAudio,但它使用 WPF 而不是 WinForms(我的项目正在使用 WinForms),我不确定如何将它转换为 WinForms。

Google 似乎没有太多关于 .Net 的信息 我唯一真正需要的是一个带有 NAudio 实现的源代码的实际示例,但我所能找到的只是其他人指出示例源代码实际上并不可用。

..而且我刚刚注意到他们的演示名称中有“wpf”,所以即使源可用,它也会类似于我无法实现的 WPFSVL 实现。 :(

【问题讨论】:

    标签: vb.net winforms audio spectrogram


    【解决方案1】:

    没有足够的空间来完全回答您的问题,恐怕我不知道有源代码的地方。我能做的最好的就是让你走上正确的道路。也许其他人知道更完整的答案。

    这不是真正的频谱图,尽管频谱分析仪可能是正确的。它有时简称为“实时分析器”或 RTA。

    第一步是将信号分成多个频段。您可以使用 FFT (This will give you an idea of how to use an FFT) 来执行此操作,我相信很多人都会这样做,但由于各种原因,这不是正确的方法。

    由于乐队如此之少,您应该可以使用2nd order filters 的银行来实现这一目标。对底部频率使用低通滤波器,对顶部频率使用高通滤波器,对中频使用带通滤波器。选择滤波器的中心频率,使频率为对数。如果您愿意,可以查找这些内容的标准频率。

    将信号划分为频段后,为每个频段跟进peak meter

    【讨论】:

    • 希望能够参考一些可以简化任务的东西。我找到了这个,但它是 C++ :(katyscode.wordpress.com/2013/01/16/…
    • 我不建议使用它,因为频率箱是线性的,而不是对数间隔的。
    • 如果我有参考资料,我会指给你看,但我没有,所以我解释了你如何自己做。
    • 不用担心,我终于得到了一个在 WinForms 中工作的示例。 (我不太确定我从哪里得到它,我认为这是一个 NAudio 示例,但事实证明不是)我不得不将它从 C# 转换为 VB,这比预期的要困难一些(有一些事情我了解到这两种语言之间的差异)但这并不是什么大问题。然后我删除了 WPF 元素并创建了一个 UserControl 并使用 System.Drawing 来绘制 FFT 数据。
    • 也许您可以发布您的解决方案作为答案,以便其他人可以找到它。
    【解决方案2】:

    我找到了我转换的例子,它是AudioVSTToolbox

    这是我的结果:http://puu.sh/4mWU8.png

    (我正在复制我的 Winamp 主题 :))

    从该工具箱中运行 Spectrum Analyzer 所需的最低要求如下:

    • “NAudio-Visualizing”文件夹的所有内容(波形内容除外,除非您需要它)。
    • CommonUtils\ColorUtils.cs
    • CommonUtils\ExtendedGraphics.cs
    • CommonUtils\MathUtils.cs
    • CommonUtils\MidiUtils.cs
    • CommonUtils\Audio\NAudio\AudioUtilsNAudio.cs
    • CommonUtils\Audio\NAudio\NAudio.dll
    • CommonUtils\FFT\AudioAnalyzer.cs
    • CommonUtils\FFT\FFTWindows.cs
    • CommonUtils\FFT\LomontFFT.cs
    • CommonUtils\FFT\ExocortexDSP\Complex.cs
    • CommonUtils\FFT\ExocortexDSP\ComplexF.cs
    • CommonUtils\FFT\ExocortexDSP\Fourier.cs
    • CommonUtils\FFT\ExocortexDSP\FourierDirection.cs

    如果转换为 VB .Net,我使用了转换器here。虽然它不能正确转换所有内容,但需要以下值得注意的修复:(不幸的是,我不记得我所做的所有更改,这并不难,您可以搜索您可能遇到的任何转换问题)

    • MathUtils 类中从任何Yield return ... 语句中删除return 并将Iterator 添加到方法中。
    • MathUtils 类更改为模块以修复扩展错误。
    • ...,Else 修复Case 语句。
    • For Each 语句中删除var
    • ExtendedGraphics 类中,将命名空间 System.Drawing.Extended 重命名为 AudioSystem.Drawing.Extended,因为它与 System 命名空间冲突。

    我个人做了一些改变:

    • NAudioEngine 类中,我将DesiredLatency 属性的值更改为200,因为默认会导致静态。

    • NAudioEngine 类中,我将暂停功能更改为使用淡入淡出,因为在没有淡入淡出的情况下,似乎有一个错误会在恢复时产生静态。进行以下更改以添加淡入淡出(以及额外的音量控制):

    添加字段:

        Private m_Volume As Single = 0.2F 'Desired default volume
        Private audioFileReader As AudioFileReader
        Private fadeInOut As FadeInOutSampleProvider
        Private m_fadeDuration As Integer = 250 'Desired fading duration
    

    OpenFile方法中,将Try语句中的全部改为:

        waveOutDevice = New WaveOutEvent() With { _
            .DesiredLatency = definedLatency _
        }
        audioFileReader = New AudioFileReader(path)
        ActiveStream = DirectCast(audioFileReader, WaveStream)
        inputStream = New WaveChannel32(ActiveStream)
    
        fadeInOut = New FadeInOutSampleProvider(New WaveToSampleProvider(inputStream))
        audioFileReader.Volume = Volume()
    
        sampleAggregator = New SampleAggregator(m_fftDataSize)
        AddHandler inputStream.Sample, AddressOf inputStream_Sample
        waveOutDevice.Init(New SampleToWaveProvider(fadeInOut))
    
        ChannelLength = inputStream.TotalTime.TotalSeconds
        FileTag = TagLib.File.Create(path)
        GenerateWaveformData(path)
        CanPlay = True
    

    Pause()方法中将waveOutDevice.Pause()改为fadeInOut.BeginFadeOut(fadeDuration())

    Play() 方法中,在CanPlay 语句中:

        fadeInOut.BeginFadeIn(fadeDuration())
        waveOutDevice.Play()
    

    要将图形的样式更改为条形,在自定义频谱分析器控件的代码中,将默认值Public DoSpectrumGraph As Boolean = True 更改为False。然后,您可以更改上面的字段以根据需要设置条形样式。

    Event Overrides 区域,您可以更改颜色/绘制方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多