99 lines
2.7 KiB
C#
99 lines
2.7 KiB
C#
|
|
using UnityEngine;
|
|||
|
|
using UnityEngine.UI;
|
|||
|
|
|
|||
|
|
public class AudioWaveFormVisualization : MonoBehaviour
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>AudioClip <20>ὫAudioClip<69>Ϲ<EFBFBD><CFB9>ص<EFBFBD><D8B5><EFBFBD>Ƶ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Texture2D<32><44>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="_clip"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ</param>
|
|||
|
|
/// <returns>һ<><D2BB><EFBFBD><EFBFBD>ͼ</returns>
|
|||
|
|
public static Texture2D BakeAudioWaveform(AudioClip _clip)
|
|||
|
|
{
|
|||
|
|
int resolution = 20; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD>ߵĸ߶<C4B8>
|
|||
|
|
int width = 1920; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>Texture2DͼƬ<CDBC>Ŀ<EFBFBD><C4BF><EFBFBD>
|
|||
|
|
int height = 200; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>Texture2DͼƬ<CDBC>ĸ߶<C4B8>
|
|||
|
|
|
|||
|
|
resolution = _clip.frequency / resolution;
|
|||
|
|
|
|||
|
|
float[] samples = new float[_clip.samples * _clip.channels];
|
|||
|
|
_clip.GetData(samples, 0);
|
|||
|
|
|
|||
|
|
float[] waveForm = new float[(samples.Length / resolution)];
|
|||
|
|
print("<22><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>Ϊ:"+waveForm.Length);
|
|||
|
|
|
|||
|
|
float min = 0;
|
|||
|
|
float max = 0;
|
|||
|
|
bool inited = false;
|
|||
|
|
|
|||
|
|
//<2F><>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
for (int i = 0; i < waveForm.Length; i++)
|
|||
|
|
{
|
|||
|
|
waveForm[i] = 0;
|
|||
|
|
|
|||
|
|
for (int j = 0; j < resolution; j++)
|
|||
|
|
{
|
|||
|
|
waveForm[i] += Mathf.Abs(samples[(i * resolution) + j]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!inited)
|
|||
|
|
{
|
|||
|
|
min = waveForm[i];
|
|||
|
|
max = waveForm[i];
|
|||
|
|
inited = true;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (waveForm[i] < min)
|
|||
|
|
{
|
|||
|
|
min = waveForm[i];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (waveForm[i] > max)
|
|||
|
|
{
|
|||
|
|
max = waveForm[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//waveForm[i] /= resolution;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>ɫ
|
|||
|
|
Color backgroundColor = new Color(0.5f,0.5f,0.5f,0f);
|
|||
|
|
Color waveformColor = Color.white;
|
|||
|
|
Color[] blank = new Color[width * height];
|
|||
|
|
Texture2D texture = new Texture2D(width, height);
|
|||
|
|
|
|||
|
|
for (int i = 0; i < blank.Length; ++i)
|
|||
|
|
{
|
|||
|
|
blank[i] = backgroundColor;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
texture.SetPixels(blank, 0);
|
|||
|
|
|
|||
|
|
float xScale = (float)width / (float)waveForm.Length;//ȷ<><C8B7>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>
|
|||
|
|
|
|||
|
|
int tMid = (int)(height / 2.0f);
|
|||
|
|
float yScale = 1;
|
|||
|
|
|
|||
|
|
if (max > tMid)
|
|||
|
|
{
|
|||
|
|
yScale = tMid / max;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (int i = 0; i < waveForm.Length; ++i)
|
|||
|
|
{
|
|||
|
|
int x = (int)(i * xScale);
|
|||
|
|
int yOffset = (int)(waveForm[i] * yScale);
|
|||
|
|
int startY = tMid - yOffset;
|
|||
|
|
int endY = tMid + yOffset;
|
|||
|
|
|
|||
|
|
for (int y = startY; y <= endY; ++y)
|
|||
|
|
{
|
|||
|
|
texture.SetPixel(x, y, waveformColor);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
texture.Apply();
|
|||
|
|
return texture;
|
|||
|
|
}
|
|||
|
|
}
|