2017-06-01 481 views
2

我试图在播放歌曲之前预先处理一首歌曲并执行一些节拍检测(而不是实时播放歌曲)。我的基本想法是以每秒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; 
} 

回答

1

回放。我的猜测是,它是从音频线程而不是剪辑本身采样,因为用户可能还添加了后续音频过滤器。尝试明确播放循环中的剪辑:

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