我使用FMOD进行音频分析,使用system :: getSpectrum获取频率数据。 我的问题是关于FMOD在场景后面使用什么数据来执行FFT。 例如,如果我的输出速率是44100Hz,我用1024个样本调用getSpectrum()每秒30次(每0.03333秒):
system.getSpectrum(data, 1024, 0, FMOD_DSP_FFT_WINDOW_BLACKMANHARRIS);
FMOD是否只拍摄了最后播放的1024个PCM样本并对其进行了FFT?在这种情况下,如果在getSpectrum()调用之间实际读取并播放了1470个样本,则仅处理最后1024个样本,并且我们丢失了中间446个浮点数的信息。 然后我调用getSpectrum的间隔的精度变得非常重要,因为如果我在0.033秒之后调用它并且在0.034秒之后调用它,则不会得到相同的结果,这使得整个事情非常依赖于FPS并且完全未定。 任何人都可以向我提供有关FMOD底部机制的见解以及如何使其成为确定性的吗?
答案 0 :(得分:1)
通常,如果您以近似的视频帧间隔或其他类似的定时器事件处理音频数据,您首先要计算已到达的新音频样本的数量(加上之前遗留的任何样本),除以FFT帧长度和/或偏移,截断为一个整数,并处理那么多帧,并保存剩余的未处理样本用于下一个处理时间,这样你就不会“丢失它们的信息”。
您通常不会在每30 Hz回调时调用一次FFT,而无需检查新音频样本的数量并根据需要进行缓冲。
如果您不希望图形显示抖动,则必须在音频帧结果中进行一些插值,和/或更精确地同步音频和视频时,同时使用可以很好地划分的帧偏移。
答案 1 :(得分:0)
我必须联系FMOD支持人员以获得答案。我简而言之,FMODs FFT每1024个样本更新一次,我可以尽快获得新数据,并检查它是否与我得到它的时间不同。