unity实时音频可视化

  最近需要实现unity将实时接受的音频可视化,在网上找了半天,基本实现的都是将已有的音频文件可视化的,唯一找到的一个的做法还是取点画拖尾,得让unity的镜头随着它移动,不太适合,所以只能自己缝缝补补,结合了一下他们的做法。

  基本的想法就是用xchart在unity中画一个柱状图,然后每帧去获取录取的音频的散点数值,从中取n个点赋值给柱子的高度,就能让柱状图随着接受的音频改变而不停跳动了。

  大家做的时候就只需要:

第一步: 复制代码 创建一个脚本

第二步:用xchart生成一个柱状图

第三步:将脚本放到空物体上,将你的柱状图拖到chart栏里面

unity实时音频可视化_第1张图片

 第四步:运行

大家做的时候记得要把脚本里获取的音频数值数量改成和自己柱状图柱体的数量一致。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XCharts;
using XCharts.Runtime;

public class voicev : MonoBehaviour
{
    public BarChart chart;
    // Start is called before the first frame update
    public static float volume;
    private AudioClip micRecord;
    string device;
    void Start()
    {
        device = Microphone.devices[0]; //获取设备麦克风
        micRecord = Microphone.Start(device, true, 999, 44100); //44100音频采样率   固定格式


    }

    // Update is called once per frame
    void Update()
    {
        float[] tep = GetRandomVolumeData();
        
        BarChart bar = chart.GetComponent();
        int[] array = new int[5]; // 创建一个长度为 10 的整数数组
        if (tep != null)
        {
            if (tep[5]>0)
            {
                for (int i = 0; i < 5; i++)
                {
                    bar.UpdateData(0, i, tep[i] * 10000); 
                }
                chart.RefreshChart();
            }
            else
                {
                for (int i = 0; i < 5; i++)
                {
                    bar.UpdateData(0, i, 0);
                }
                chart.RefreshChart();
            }
            
        }
        
    }
    //引入System命名空间

float[] GetRandomVolumeData() 
{
    float maxVolume = 0f; 
    float[] volumeData = new float[128]; //定义一个float类型的数组,用来存储音频的数据,数组长度为128
    int offset = Microphone.GetPosition(device) - 128 + 1; 
    if (offset < 0) //如果偏移量小于0,说明没有足够的音频数据
    {
            return null;

     }

        micRecord.GetData(volumeData, offset); //调用micRecord对象的GetData方法,将音频数据从偏移量开始填充到数组中

    int[] randomIndex = new int[6]; 
    bool isDone = false; 
    int count = 0; 
    while (!isDone) 
    {
        int tempIndex =UnityEngine.Random.Range(0, 127); 
        bool isRepeat = false; 
        for (int i = 0; i < count; i++) 
        {
            if (tempIndex == randomIndex[i]) 
            {
                isRepeat = true; 
                break; 
            }
        }
        if (!isRepeat) //如果当前随机数没有重复
        {
            randomIndex[count] = tempIndex;
            count++; 
        }
        if (count == 6) //如果已经生成了5个随机数
        {
            isDone = true; //将isDone变量设为true,结束循环
        }
    }
        for (int i = 0; i < 128; i++)
        {
            float tempMax = volumeData[i]; //修改音量的敏感值
            if (maxVolume < tempMax)
            {
                maxVolume = tempMax;
            }
        }
        float[] randomVolumeData = new float[6];
        //if(maxVolume>0.0000001f)
        {
            for (int i = 0; i < 6; i++) 
            {
                randomVolumeData[i] = Math.Abs(volumeData[randomIndex[i]]); 
            }
        }
        

    return randomVolumeData; //返回新数组作为函数的结果
}

}

你可能感兴趣的:(unity,游戏引擎,音视频,c#)