public void GetSpectrumData(float[] samples, int channel, FFTWindow window);

这是AudioSoucre类型的方法,获取频谱数据;

  • samples:采样率,就是说采集多长一段的频谱,必须为2^n,但是最小64,最大8192。

  • channel:信道,默认0

  • window:采样方式(Enum),有下列几种

    Rectangular W[n] = 1.0.
    Triangle W[n] = TRI(2n/N).
    Hamming W[n] = 0.54 - (0.46 * COS(n/N) ).
    Hanning W[n] = 0.5 * (1.0 - COS(n/N) ).
    Blackman W[n] = 0.42 - (0.5 * COS(n/N) ) + (0.08 * COS(2.0 * n/N) ).
    BlackmanHarris W[n] = 0.35875 - (0.48829 * COS(1.0 * n/N)) + (0.14128 * COS(2.0 * n/N)) - (0.01168 * COS(3.0 * n/N)).


22050HZ的频率分在几个范围:(从小到大声音越来越尖锐)
20~60:
60~250:
250~500:
500~2000:
2000~4000:
4000~6000:
6000~20000:

22050采样512个数据,一个sample 43hz;

分成8段:

0: 2      86hz
1: 4      172hz
2: 8      344hz
3: 16    688hz
4: 32    1376hz
5: 64    2752hz
6: 128  5504hz
7: 256  11008hz

Unity中新建一个类,AudioVisable
using System.Collections;
using System.Collections.Generic;
using UnityEngine;[RequireComponent(typeof(AudioSource))]
public class AudioVisable : MonoBehaviour {AudioSource audioSource;public  float[] samples = new float[512];float[] freqBand = new float[8];float[] bandBuffer = new float[8];float[] bufferDecrease = new float[8];float[] _freqBandHighest = new float[8];public static float[] _audioBand = new float[8];public static float[] _audioBandBuffer = new float[8];public static float _Amplitude, _AmplitudeBuffer;float _AmplitudeHighest;void Start () {audioSource = GetComponent<AudioSource>();}void CreateAudioBands(){for (int i = 0; i < 8; i++){if (freqBand[i] > _freqBandHighest[i]){_freqBandHighest[i] = freqBand[i];}_audioBand[i] = (freqBand[i]/_freqBandHighest[i]);_audioBandBuffer[i] = (bandBuffer[i]/_freqBandHighest[i]);}}void Update () {GetSpectrumAduioSource();MakeFrequencyBands();BandBuffer();CreateAudioBands();GetAmplitude();}void GetAmplitude(){float _CurrentAmplitude = 0;float _CurrentAmplitudeBuffer = 0;for (int i = 0; i < 8; i++){_CurrentAmplitude += _audioBand[i];_CurrentAmplitudeBuffer += _audioBandBuffer[i];}if (_CurrentAmplitude > _AmplitudeHighest)_AmplitudeHighest = _CurrentAmplitude;_Amplitude = _CurrentAmplitude / _AmplitudeHighest;_AmplitudeBuffer = _CurrentAmplitudeBuffer / _AmplitudeHighest;}void GetSpectrumAduioSource(){audioSource.GetSpectrumData(samples, 0, FFTWindow.Blackman);}void MakeFrequencyBands(){int count = 0;for (int i = 0; i < 8; i++){float average = 0;int sampleCount = (int)Mathf.Pow(2,i+1);if (i == 7){sampleCount += 2;}for (int j = 0; j < sampleCount; j++){average += samples[count]*(count+1);count++;}average /= count;freqBand[i] = average * 10;}}void BandBuffer(){for (int i = 0; i < 8; i++){if (freqBand[i] > bandBuffer[i]){bandBuffer[i] = freqBand[i];bufferDecrease[i] = 0.005f;}if (freqBand[i] < bandBuffer[i]){bandBuffer[i] -= bufferDecrease[i];bufferDecrease[i] *= 1.2f;}}}
}

这个脚本挂在Camera上,可以看到采样的数据的变化;


Unity中,新建一个cube预制体开启,使用standard材质,打开hdr的外发光emission;

再新建一个脚本ParamCube,挂在cube预制体上;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ParamCube : MonoBehaviour {public int band;public float startScale, scaleMultiplier;Material material;void Start () {material = GetComponent<MeshRenderer>().materials[0];}// Update is called once per framevoid Update () {transform.localScale = new Vector3(transform.localScale.x, (AudioVisable._audioBandBuffer[band]) * scaleMultiplier + startScale, transform.localScale.z);Color color = new Color(AudioVisable._audioBandBuffer[band], AudioVisable._audioBandBuffer[band], AudioVisable._audioBandBuffer[band]);material.SetColor("_EmissionColor",color);      }
}

然后在Scene中放8个cube预制体,把脚本中StartScale和scaleMultiplier调为1和10,band为0~7;


最后,在Camera的AudioSource组件上添加音频,运行~

参考:
国外Youtube上的大神,链接如下:
https://www.youtube.com/playlist?list=PL3POsQzaCw53p2tA6AWf7_AWgplskR0Vo

Unity——炫酷的音频可视化相关推荐

  1. 数据大屏产品介绍PPT_有这些图表美化工具,十分钟配出炫酷的数据可视化大屏...

    有这些图表美化工具,十分钟配出炫酷的数据可视化大屏 数据可视化难,试试这些图表美化 图表可视化,是很多同学头疼的问题,因此找到一款操作简便,少花钱,可编辑数据,导出样式多的图表生成网站迫在眉睫. 1. ...

  2. 怎么用ai做出适量插画_怎么用最简单的方法,做出最炫酷的数据可视化图表?...

    如果要问数据怎样做才能显得最装逼,那么答案一定只有一个: "数据可视化"! 看上去也很炫酷对不对,其实上面的可视化图表其实并不复杂,很多人推荐的Python.R语言.Tableau ...

  3. 可视化实战!Python+BI,手把手教你做炫酷的NBA可视化分析

    之前手痒做了一次NBA可视化分析,好多人追着我问教程,这两天终于闲下来了,花时间整理这篇NBA可视化分析教程,手把手教大家做一次炫酷的数据可视化分析! 先部分展示本次教程的作品: 数据获取 本次可视化 ...

  4. python做bi系统_可视化实战!Python+BI,手把手教你做炫酷的NBA可视化分析

    之前手痒做了一次NBA可视化分析,好多人追着我问教程,这两天终于闲下来了,花时间整理这篇NBA可视化分析教程,手把手教大家做一次炫酷的数据可视化分析! 先部分展示本次教程的作品: 数据获取 本次可视化 ...

  5. 推荐收藏|又带来了12个炫酷的数据可视化作品含源码

    之前分享了10个炫酷的数据可视化大屏源码,反响很大,好多人在后台回复获取源码,这次,我又带来了12个炫酷的数据可视化大屏源码,都是从网上收集的,都测试后可以使用,在我电脑(1920X1080分辨率下) ...

  6. echarts 大屏可视化_看似复杂炫酷的数据可视化设计,用这波神器轻松搞定!

    数据大屏与数据可视化 数据可视化是目前对数据展示最常用的方式.数据的可视化设计有助于将复杂的数据,用最易理解的方式展示在用户的面前. 数据可视化在中后台的设计中很常见,通常主要用于分析和决策,对实时性 ...

  7. elementui的tree组件页面显示不出数据_只要10分钟,教你配置出炫酷的数据可视化大屏...

    在电影<摩天营救>中,监控中心的全方位展示屏幕给人印象深刻.现在这种立体化大屏幕似乎成了好莱坞大片的标配.其实,这种逼格很高的镜头就是一个数据可视化大屏.随着社会信息化的高速增长,数据可视 ...

  8. MATLAB | πDay快乐,pi居然有这么多炫酷好玩的可视化

    πDay快乐! 3.14 π Day 到了,本期给出一些非常炫酷的pi的可化并给出完整 MATLAB 代码. 首先,我们要获得pi的前n位小数,需要编写如下代码(为了防止不精准会多取几位尾数,用的时候 ...

  9. 炫酷大屏demo_只要10分钟,教你配置出炫酷的数据可视化大屏

    在电影<摩天营救>中,监控中心的全方位展示屏幕给人印象深刻.现在这种立体化大屏幕似乎成了好莱坞大片的标配.其实,这种逼格很高的镜头就是一个数据可视化大屏. 随着社会信息化的高速增长,数据可 ...

最新文章

  1. Window下VS运行达梦DPI
  2. java线程interrupt用法_Java 如何中断线程
  3. web前端期末大作业--响应式汽车租赁网页设计--(HTML+CSS+JavaScript)实现
  4. Android Eclipse ADT使用Tips
  5. Fabric学习笔记(一)- Centos 7下的Fabric 2.3.2环境搭建
  6. 简易版Dubbo方法级性能监控(实现TP90、TP99)
  7. Spark代码生成技术之现象CodeGenerator
  8. mac ~/.bash_profile 重启失效
  9. gjb150.16a-2009振动试验标准及介绍
  10. 电工模拟接线软件 app_配电柜接线图
  11. 基于RS485通讯总线的ModbusRtu协议C#上位机开发源码
  12. Chrome浏览器书签同步配置方法
  13. Android马甲包
  14. 初识linux之进程
  15. 简洁但功能强大的EditPlus UltraEdit
  16. 程序 卡塔_我想念微软恩卡塔
  17. ArcGIS如何将Excel表格转换为SHP格式
  18. Mysql 死锁和死锁的解决方案
  19. 模拟赛20200228(yyq)【右链+dfs序,子树管辖,聚集水流问题】
  20. c语言横纵坐标乘法,C语言 · 猜算式 · 乘法竖式

热门文章

  1. c语言规定整型变量长度,C语言整型变量所占内存字节数
  2. 历年真题自考c语言,C 自考历年真题小集.docx
  3. 周末踩了个大坑。。。
  4. http http2和https的区别
  5. 作一个“有品有趣有范儿有腔调”的木偶
  6. Listary搜索工具
  7. 蒙文计算机,蒙古文整词计算机生成理论研究
  8. 关于NXP官网i.mx6q与飞凌开发板i.mx6q之间的差异
  9. nfs +nis+ssh(2)
  10. 正宗吉林通化葡萄酒的挑选方法