如何使用audioSettings.dspTime获得准确的时间传递方法?

时间:2015-10-05 17:09:23

标签: c# audio unity3d

感谢您寻找和寻求任何帮助/建议。

我试图将音频与游戏玩法同步。

这是一种使用audioSettings.dspTime找出已经过了多少时间的准确方法吗?

我用一个表示时间的浮点数乘以song.clip.frequency。

    float myChosenAmountOfTimeInSamples = myChosenAmountOfTime * song.clip.frequency; 
    float audioSecondsLater = Audio + myChosenAmountOfTimeInSamples;

这就是audioSettings.dspTime * song.clip.frequency

    float Audio = (float)AudioSettings.dspTime * song.clip.frequency;
    float audioSecondsLater = Audio + myChosenAmountOfTimeInSamples;

我使用此代码查看是否有效。据我所知,它会在1秒后发生

更新

if (Input.GetKeyDown (KeyCode.A)){
            StartCoroutine(test ());
        }

和协程

IEnumerator test ()
{
    float Audio = (float)AudioSettings.dspTime * song.clip.frequency;
    float myChosenAmountOfTime = 1f;
    float myChosenAmountOfTimeInSamples = myChosenAmountOfTime * song.clip.frequency; 
    float audioSecondsLater = Audio + myChosenAmountOfTimeInSamples;

print ("Audio seconds later: " + audioSecondsLater);

while (true)
    {

        Audio = (float)AudioSettings.dspTime * song.clip.frequency;
        if (Audio >= audioSecondsLater)
        {
            print ("Audio Now: " + Audio); // Theoretically this is 1 second later
            break;
        }
    yield return new WaitForSeconds(1 / 1000f);
    }
}

1 个答案:

答案 0 :(得分:0)

我不完全确定,但我认为你走的正确。我之前已经针对单个AudioClip进行了同步,但我将所有时间保留在样本中。要检查当前示例,我检查正在播放的剪辑上的AudioSource.timeSamples。我使用REAPER检查音频文件,找出事件发生在文件中的哪个样本,然后将其与timeSamples进行比较,看看我的同步事件是否已经发生。

AudioSource还有一个time属性,这是一个以秒为单位的播放位置,不过请参阅文档中有关与压缩音频一起使用时的不准确性的说明。