Unity3d:应该在哪个类中调用音频处理或计算
本文关键字:调用 音频 处理 计算 Unity3d | 更新日期: 2023-09-27 18:27:04
我正在创建一个音频可视化工具,该工具使用Unity5游戏引擎对振幅做出反应。我使用对数、RMS值和.GetOutputData.计算振幅
最初,我从Update类调用了我的函数,但它的反应时间太慢,可视化工具似乎与音乐不同步。我现在从OnGUI类调用我的函数,但它仍然不是对音乐的实时反应。
我应该何时或如何调用我的函数以获得最佳的实时音频可视化效果?有更好的方法吗?
感谢您的帮助。
我的可视化功能:
void OnGUI ()
{
//PROCESS AMPLITUDE:
/***/
///RETRIEVE THE AUDIO-SOURCE SAMPLES:
//Declare and Initialize an array to store the samples;
float[] samples = new float[iSamples];
//Pass the samples' array to the audio-source;
auTheCurrentSong.GetOutputData (samples, 0);
///CALCULATE THE RMS VOLTAGE VALUE:
//Declare and Initialize the sum of the squared samples;
float fTotalSquaredSamples = 0.0f;
//FOR each sample in the samples' array...
for (int counter=0; counter < iSamples; counter++) {
//... Calculate the sum of the squared samples;
fTotalSquaredSamples += Mathf.Pow (samples [counter], 2);
}
//Calculate the average or mean of the total squared samples;
float fMeanSquaredSamples = fTotalSquaredSamples/iSamples;
//Calc ulate the root mean square (RMS) value;
float fRMS = Mathf.Sqrt (fMeanSquaredSamples);
//CALCULATE THE DECIBEL VALUE FOR OUTPUT:
//Calculate the decibel value;
float fdBValue = 20*Mathf.Log10(fRMS/fReference);
//Clamp dB values:
//IF dB values are less than -160...
if (fdBValue < -160)
{
//...Clamp dB values to -160;
fdBValue = -160;
}
//RESPOND TO PRODUCT:
//Debug the decibel values to check for irregularities;
Debug.Log (fdBValue);
//Scale a 3-D cube vertically depending on the dB value;
transform.localScale = new Vector3 (1.0f, fdBValue, 0.0f);
/***/
}
您希望在渲染立方体之前重新缩放立方体,以便在"测量"振幅和显示结果之间具有尽可能小的延迟。看看Unity手册中的这一页,页面下方是一个流程图,解释了MonoBehavior何时调用每个函数。正如您所看到的,OnPreRender()是在渲染场景之前调用的最后一个函数,所以我会尝试将代码放在那里。如果不起作用,请尝试之前的函数,依此类推。
执行计算或可视化代码的每帧方法实际上并不重要。您可以使用从更新到LateUpdate、OnPreRender、OnPostRender的任何内容,因为它们都被称为每帧,实际上没有可测量的时间差。
如果您的可视化似乎落后于当前播放的音频输出,则有几种可能性:
- 你错了,可视化实际上是正确的
- 可视化是错误的,你不小心镜像了它或类似的东西
- 可视化是正确的,但它可视化的数据计算不正确
- 数据、计算和可视化是正确的,但使用GetOutputData获取的数据已经过时
- 您的帧速率非常低(~5fps),因此当前播放的音频和可视化结果之间确实存在显著的时间差。如果按帧使用Debug.Log(),它的速度会非常慢