【问题标题】:Unity3d: What class should audio processes or calculations be called in?Unity3d:应该在什么类中调用音频处理或计算?
【发布时间】:2016-03-23 14:03:33
【问题描述】:

我正在创建一个使用 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);
    /***/
}

【问题讨论】:

  • 如果任何答案对您有用,如果您接受该答案,对其他人会有所帮助。如果没有,请随时评论给出的答案,或更新您的问题。
  • 我目前正在处理多个项目,现在没有时间关注这个特定的项目。并且因为我暂时无法删除或隐藏此问题,您只需要等到我可以返回此线程并提供反馈。同时,如果您有同样的问题,请查看是否有任何答案适合您,然后如果你希望你可以分享你的结果。 :) 否则请耐心等待。

标签: c# audio unity3d unityscript


【解决方案1】:

您希望在渲染立方体之前对其进行重新缩放,以便在“测量”幅度和显示结果之间有尽可能小的延迟。查看 Unity 手册中的 this page,页面下方是一个流程图,解释了在 MonoBehaviour 上调用每个函数的时间。如您所见, OnPreRender() 是在渲染场景之前调用的最后一个函数,因此我会尝试将您的代码放在那里。如果这不起作用,请尝试之前的功能,依此类推。

【讨论】:

  • 谢谢你,我会尽快回来。
【解决方案2】:

您执行计算或可视化代码的每帧方法并不重要。 您可以使用从 Update 到 LateUpdate、OnPreRender、OnPostRender 的任何内容,因为它们在每一帧都被调用,几乎没有可测量的时间差。

如果您的可视化效果似乎落后于当前播放的音频输出,有几种可能:

  1. 你错了,可视化实际上是正确的
  2. 可视化错误,您不小心镜像了它或类似的东西
  3. 可视化正确,但其可视化的数据计算错误
  4. 数据、计算和可视化都是正确的,但您使用 GetOutputData 获取的数据已过时。
  5. 您的帧速率太低 (~5 fps),以至于当前播放的音频与可视化结果之间确实存在明显的时间差。如果按帧使用 Debug.Log(),它会非常(!!)慢。

【讨论】:

  • 谢谢你,我会尽快回来。
猜你喜欢
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多