在Unity中预处理音频频谱数据

4
我正在尝试在播放歌曲之前对其进行预处理并实现一些节拍检测(不是实时播放)。我的基本想法是以大约每秒90次的频率采样光谱数据,并通过增加AudioSource.timeSamples的值并调用AudioSource.GetSpectrumData()来实现。但我提供的数组似乎总是填充相同的值。
设置timeSamples似乎并没有更新AudioSource使用的样本。但是,如果我正常播放歌曲并调用GetSpectrumData(),我的数组将被正确地填充数据。
有什么办法可以让AudioSource在调用GetSpectrumData()时使用timeSamples中设置的样本,或者其他方法可以解析歌曲以获取这些数据吗?
以下是代码示例(song是一个AudioSource),第二个for循环是感兴趣的区域:
float[][] get_spectrum_data()
{
    int samples = song.clip.samples;
    int sample_rate = song.clip.frequency / parse_rate;
    int arr_siz = samples / sample_rate;
    FFTWindow win = FFTWindow.Rectangular;  //which type do we want?

    float[][] spectrum = new float[arr_siz][];
    for (int i = 0; i < arr_siz; i++)
    {
        spectrum[i] = new float[spec_res];
    }

    for (int i = 1, j = 0; j < arr_siz; i += sample_rate, j++)
    {
        song.timeSamples = i;
        song.GetSpectrumData(spectrum[j], 0, win);
    }

    return spectrum;
}
1个回答

1
我认为AudioSource.GetSpectrumData依赖于AudioSource当前正在播放。 我猜它是从音频线程而不是剪辑本身进行采样,因为用户可能还添加了后续的音频过滤器。 在循环中尝试显式播放剪辑:
for (int i = 1, j = 0; j < arr_siz; i += sample_rate, j++)
{
    song.Play();
    song.timeSamples = i;
    song.GetSpectrumData(spectrum[j], 0, win);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接