我想创建一个使用C#语言和.NET Framework的声音可视化系统。 这可能看起来像在Winamp应用程序中。 也许存在免费的图书馆或一些有趣的文章,描述如何做到这一点? 例子: alt text http://img44.imageshack.us/img44/9982/examplel.pngC#声音可视化
C#声音可视化
回答
您可以尝试以下链接
OpenVP(是开发音乐可视化,用C#编写的自由和开源平台),请参阅OpenVP Screenshots。
Play and Visualize WAV Files using Managed Direct Sound
再见。
下面是一个脚本,用于计算计算机上使用WASAPI API播放的任何声音的FFT。从我们建议先锁定它,因为这是一个单独的线程修改不同的脚本检索barData时
using CSCore;
using CSCore.SoundIn;
using CSCore.Codecs.WAV;
using WinformsVisualization.Visualization;
using CSCore.DSP;
using CSCore.Streams;
using System;
public class SoundCapture
{
public int numBars = 30;
public int minFreq = 5;
public int maxFreq = 4500;
public int barSpacing = 0;
public bool logScale = true;
public bool isAverage = false;
public float highScaleAverage = 2.0f;
public float highScaleNotAverage = 3.0f;
LineSpectrum lineSpectrum;
WasapiCapture capture;
WaveWriter writer;
FftSize fftSize;
float[] fftBuffer;
SingleBlockNotificationStream notificationSource;
BasicSpectrumProvider spectrumProvider;
IWaveSource finalSource;
public SoundCapture()
{
// This uses the wasapi api to get any sound data played by the computer
capture = new WasapiLoopbackCapture();
capture.Initialize();
// Get our capture as a source
IWaveSource source = new SoundInSource(capture);
// From https://github.com/filoe/cscore/blob/master/Samples/WinformsVisualization/Form1.cs
// This is the typical size, you can change this for higher detail as needed
fftSize = FftSize.Fft4096;
// Actual fft data
fftBuffer = new float[(int)fftSize];
// These are the actual classes that give you spectrum data
// The specific vars of lineSpectrum here aren't that important because they can be changed by the user
spectrumProvider = new BasicSpectrumProvider(capture.WaveFormat.Channels,
capture.WaveFormat.SampleRate, fftSize);
lineSpectrum = new LineSpectrum(fftSize)
{
SpectrumProvider = spectrumProvider,
UseAverage = true,
BarCount = numBars,
BarSpacing = 2,
IsXLogScale = false,
ScalingStrategy = ScalingStrategy.Linear
};
// Tells us when data is available to send to our spectrum
var notificationSource = new SingleBlockNotificationStream(source.ToSampleSource());
notificationSource.SingleBlockRead += NotificationSource_SingleBlockRead;
// We use this to request data so it actualy flows through (figuring this out took forever...)
finalSource = notificationSource.ToWaveSource();
capture.DataAvailable += Capture_DataAvailable;
capture.Start();
}
private void Capture_DataAvailable(object sender, DataAvailableEventArgs e)
{
finalSource.Read(e.Data, e.Offset, e.ByteCount);
}
private void NotificationSource_SingleBlockRead(object sender, SingleBlockReadEventArgs e)
{
spectrumProvider.Add(e.Left, e.Right);
}
~SoundCapture()
{
capture.Stop();
capture.Dispose();
}
public float[] barData = new float[20];
public float[] GetFFtData()
{
lock (barData)
{
lineSpectrum.BarCount = numBars;
if (numBars != barData.Length)
{
barData = new float[numBars];
}
}
if (spectrumProvider.IsNewDataAvailable)
{
lineSpectrum.MinimumFrequency = minFreq;
lineSpectrum.MaximumFrequency = maxFreq;
lineSpectrum.IsXLogScale = logScale;
lineSpectrum.BarSpacing = barSpacing;
lineSpectrum.SpectrumProvider.GetFftData(fftBuffer, this);
return lineSpectrum.GetSpectrumPoints(100.0f, fftBuffer);
}
else
{
return null;
}
}
public void ComputeData()
{
float[] resData = GetFFtData();
int numBars = barData.Length;
if (resData == null)
{
return;
}
lock (barData)
{
for (int i = 0; i < numBars && i < resData.Length; i++)
{
// Make the data between 0.0 and 1.0
barData[i] = resData[i]/100.0f;
}
for (int i = 0; i < numBars && i < resData.Length; i++)
{
if (lineSpectrum.UseAverage)
{
// Scale the data because for some reason bass is always loud and treble is soft
barData[i] = barData[i] + highScaleAverage * (float)Math.Sqrt(i/(numBars + 0.0f)) * barData[i];
}
else
{
barData[i] = barData[i] + highScaleNotAverage * (float)Math.Sqrt(i/(numBars + 0.0f)) * barData[i];
}
}
}
}
}
然后:它采用CSCore及其WinformsVisualization例子。
我不知道我在哪里得到了GetSpectrumPoints
,因为它似乎不在Github Repo中,但在这里。只需将其粘贴到该文件中,我的代码就可以工作。
public float[] GetSpectrumPoints(float height, float[] fftBuffer)
{
SpectrumPointData[] dats = CalculateSpectrumPoints(height, fftBuffer);
float[] res = new float[dats.Length];
for (int i = 0; i < dats.Length; i++)
{
res[i] = (float)dats[i].Value;
}
return res;
}
我试图使用你的示例代码,但它似乎不像['GetSpectrumPoints()'是一个函数](https://github.com/filoe/cscore/blob/29410b12ae35321c4556b072c0711a8f289c0544/Samples/ WinformsVisualization/Visualization/LineSpectrum.cs#L10),并检查git存储库历史记录也不会显示它。你介意澄清/更新你的答案吗? (*我正尝试将Windows上的音频捕获/处理与驱动LED灯的跨平台控制台应用程序相集成; 0.0至1.0条频率数据值就是它所需要的*) – Shane 2016-11-28 16:53:09
@Shane对不起!我现在添加了这些代码,希望有所帮助 – Phylliida 2016-12-06 00:19:59
- 1. 如何可视化声音?
- 2. Java声音可视化器
- 3. 音频可视化器C#
- 4. ActionScript 2.0中的声音可视化
- 5. 音频/语音可视化
- 6. 音乐播放器的声音水平仪可视化器
- 7. 音频可视化
- 8. 音乐可视化
- 9. 用Cb-C可视化音频数据
- 10. 在视图中播放声音变化
- 11. 音频波形可视化
- 12. android音频可视化
- 13. HTML5音频可视化?
- 14. 可视化html5音频
- 15. 适用于Android的声音可视化库
- 16. 无法获取WPF声音可视化库工作
- 17. 使用silverlight显示声音可视化器
- 18. 非常需要简单的样品声音可视化
- 19. 从C#的电视卡捕捉声音#
- 20. c中声音播放后的声音#
- 21. C#音乐/声音同步
- 22. C/C++可视化库
- 23. C++声音处理
- 24. 如何开始在C++中编写音乐可视化工具?
- 25. 音乐可视化误差在GStreamer
- 26. HTML5音频播放器的可视化
- 27. 录制时的音频可视化
- 28. 音频可视化与画布
- 29. 获取音乐可视化数据
- 30. 创建音乐可视化器
我认为这将是良好的开始,谢谢。 – 2009-08-30 22:42:44