在Unity中预处理音频频谱数据
问题描述:
我试图在播放歌曲之前预先处理一首歌曲并执行一些节拍检测(而不是实时播放歌曲)。我的基本想法是以每秒90次的频率采样频谱数据,我试图通过将AudioSource.timeSamples
增加一个值并致电AudioSource.GetSpectrumData()
来实现。但是我提供的数组总是似乎充满了相同的值。在Unity中预处理音频频谱数据
这似乎是设置timeSamples实际上并没有更新AudioSource正在使用的示例。但是,如果我正常播放歌曲并拨打电话GetSpectrumData()
,我的阵列中就会填充正确的数据,如我所料。
有什么我可以做的,使AudioSource使用在timeSamples中设置的示例,当我打电话给GetSpectrumData()
,或者我应该通过歌曲解析来获取这些数据?
感谢
下面是一个代码示例(歌曲是的AudioSource),用于循环第二是感兴趣的区域:我觉得AudioSource.GetSpectrumData依靠的AudioSource目前正在从事
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;
}
答
回放。我的猜测是,它是从音频线程而不是剪辑本身采样,因为用户可能还添加了后续音频过滤器。尝试明确播放循环中的剪辑:
for (int i = 1, j = 0; j < arr_siz; i += sample_rate, j++)
{
song.Play();
song.timeSamples = i;
song.GetSpectrumData(spectrum[j], 0, win);
}