Unity中实现获取音频的频谱的可视化均衡器

来源:互联网 发布:大富豪3.5源码下载 编辑:程序博客网 时间:2024/06/06 08:34

直接贴代码了,拿来就能用。

参考位置也提供了,需要的人拿走。


分类: Unity3D

类别: 音频处理

------------------------------------------------------------------------------------------------------------------------------------------------------------

using UnityEngine;
using System.Collections;


//Reference document 
//http://www.41post.com/4776/programming/unity-making-a-simple-audio-visualization
//


[RequireComponent (typeof(AudioSource))]
public class AudioSourceGetSpectrumData : MonoBehaviour {


public FFTWindow fftWindow = FFTWindow.Rectangular;
public int sampleSection = 256;
public float[] spectrum;
public float[] spectrumLogValues;


public float sampleInterval = 0.1f;
public int logLevel = 0;
public int dropSpeed = 1;
public int maxHeight = 50;


private float currentSampleTime = 0;
private float[] currDropSpeeds;


void Update( )
{
if(currentSampleTime < sampleInterval)
{
currentSampleTime += Time.deltaTime;
return;
}
else
currentSampleTime -= sampleInterval;


if(spectrum == null || spectrum.Length !=sampleSection)
spectrum = new float[sampleSection];
if(spectrumLogValues == null || spectrumLogValues.Length !=sampleSection)
spectrumLogValues = new float[sampleSection];
if(currDropSpeeds == null || currDropSpeeds.Length !=sampleSection)
currDropSpeeds = new float[sampleSection];


AudioListener.GetSpectrumData( spectrum, 0, fftWindow);


for( int i = 1; i < spectrum.Length-1; i++ )
{
float currentVal = 0;
if(logLevel == 0)
currentVal = spectrum[i];
if(logLevel < 0)
currentVal = Mathf.Clamp(spectrum[i]*(maxHeight+i*i), 0, maxHeight);
else
currentVal = -Mathf.Log(spectrum[i], logLevel);


if(spectrumLogValues[i] == 0 || currentVal - spectrumLogValues[i] >= Mathf.Abs(currDropSpeeds[i]))

currDropSpeeds[i] = 0;
spectrumLogValues[i] = currentVal;
}
else
{
spectrumLogValues[i] = Mathf.Clamp(spectrumLogValues[i]- currDropSpeeds[i], 0, maxHeight);
currDropSpeeds[i] += dropSpeed * Time.deltaTime;
}
}
}


void OnDrawGizmos()
{
for( int i = 1; i < spectrumLogValues.Length-1; i++)
Gizmos.DrawCube(new Vector3(i*1, 0.5f * spectrumLogValues[i], 0), new Vector3(1, spectrumLogValues[i], 1));
}
}

------------------------------------------------------------------------------------------------------------------------------------------------------------

0 0