Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity3d:音频处理或计算应该调用什么类?_C#_Audio_Unity3d_Unityscript - Fatal编程技术网

C# Unity3d:音频处理或计算应该调用什么类?

C# Unity3d:音频处理或计算应该调用什么类?,c#,audio,unity3d,unityscript,C#,Audio,Unity3d,Unityscript,我正在使用Unity5游戏引擎创建一个对振幅作出反应的音频可视化工具。我使用对数、RMS值和.GetOutputData计算振幅 最初,我从Update类调用了我的函数,但它的反应时间太慢,可视化工具似乎与音乐不同步。我现在从OnGUI类调用我的函数,但它仍然不是对音乐的实时反应 何时或如何调用我的函数以获得最佳的实时音频可视化?有更好的方法吗 谢谢你的帮助 我的可视化功能: void OnGUI () { //PROCESS AMPLITUDE: /***/ ///R

我正在使用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);
    /***/
}
void OnGUI()
{
//过程振幅:
/***/
///检索音频源示例:
//声明并初始化一个数组来存储样本;
float[]样本=新的float[iSamples];
//将样本数组传递给音频源;
auTheCurrentSong.GetOutputData(示例,0);
///计算RMS电压值:
//声明并初始化平方样本之和;
浮点数fTotalSquaredSamples=0.0f;
//对于样本数组中的每个样本。。。
对于(int计数器=0;计数器
您希望在渲染立方体之前重新缩放立方体,以便在“测量”振幅和显示结果之间有尽可能小的延迟。从Unity手册中可以看到,页面下方是一个流程图,解释了在MonoBehavior上调用每个函数的时间。如您所见,OnPreRender()是在渲染场景之前调用的最后一个函数,因此我会尝试将代码放在那里。如果不起作用,请尝试之前的函数,以此类推。

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

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

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

  • 谢谢你,我会尽快带着我的进度回来。谢谢你,我会尽快带着我的进度回来。如果任何答案对你有用,如果你接受这个答案,对其他人会有帮助。如果没有,请随意评论给出的答案,或者更新您的问题。我目前正在处理多个项目,现在没有时间关注这个具体项目。由于我无法暂时删除或隐藏此问题,您只需等待我返回此线程并提供反馈。同时,如果您有相同的问题,请查看其中任何答案是否适用于您,然后如果您愿意,您可以共享您的结果。:)否则就耐心点。