一直在寻找一种方法,整天都没有希望。 我正在创建一个具有MP3播放功能的项目,我正在尝试包含一个频谱图(或频谱分析仪......不确定它的名称是什么),类似于此http://puu.sh/4lkMn.png(Winamp)(尽管如果它是不在酒吧,那也没关系)
我目前一直在使用WMP进行音频播放,但WMP没有任何绘制频谱图的方法。
我研究了使用看起来很有希望的NAudio:http://naudio.codeplex.com/ 他们有频谱分析器的演示,但他们没有提供该演示的来源。
我也研究了使用NAudio的http://wpfsvl.codeplex.com/,但它使用的是WPF而不是WinForms(我的项目使用的是WinForms),我不确定如何将其转换为WinForms。
谷歌似乎没有太多关于.Net的信息 我真正需要的唯一的东西是带有NAudio实现的源的实际示例,但我能找到的是其他人指出示例源实际上不可用的事实。
..我只是注意到他们的演示名称中有'wpf',所以即使源是可用的,它也类似于我无法使用的WPFSVL实现。 :(
答案 0 :(得分:0)
没有足够的空间来完全回答你的问题,我担心我不知道有源代码的地方。我能做的最好的事情就是让你走上正确的道路。也许别人知道更完整的答案。
虽然频谱分析仪可能是正确的,但这并不是一个频谱图。它有时简称为“实时分析仪”或RTA。
第一步是将信号分成频段。您可以使用FFT(This will give you an idea of how to use an FFT)执行此操作,因为我确信很多人都这样做,但由于各种原因,这不是正确的方法。
由于乐队数量太少,您应该可以使用2nd order filters行来实现这一目标。底部频率使用低通,顶部频率使用高通,中频使用带通滤波器。选择滤波器的中心频率,使频率为对数。如果您愿意,可以查看这些标准的频率。
将信号划分为频段后,请为每个频段跟进peak meter。
答案 1 :(得分:0)
我找到了我转换的示例,它是AudioVSTToolbox
以下是我的所有结果:http://puu.sh/4mWU8.png
(我正在复制我的Winamp主题:))
从该工具箱中获取频谱分析仪所需的最低要求如下:
如果转换为VB .Net,我使用转换器here。它并没有正确地转换所有内容,以下是需要注意的重要修复:(我不记得所有我做过的更改,不是很难,你可以搜索你可能遇到的任何转换问题)
MathUtils
班级中从return
个语句中删除了Yield return ...
,并将Iterator
添加到该方法中。MathUtils
类更改为模块以修复带扩展名的错误。Case
修复...,Else
语句。var
语句中删除For Each
。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()
要将图形样式更改为条形,请在自定义Spectrum Analyzer控件的代码中将Public DoSpectrumGraph As Boolean = True
的默认值更改为False
。然后你可以改变上面的字段来设置你想要的条形。
在Event Overrides
区域,您可以更改颜色/绘图方法。