2017-06-01 57 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); 
}