这是对我之前问题的跟进:Rendering some sound data into one new sound data?
我正在创建一个程序来处理包含声音库和时间偏移的文件,以便在必须播放声音时进行标记并从中生成波形文件。
所以我认为FMOD_OUTPUTTYPE_WAVWRITER非常适合这项工作。
对于声音库,请在文件中设想类似的内容:
0 kick.wav
1 hit.wav
2 flute.wav
左边的数字描述了右边声音文件名的声音ID, 和时间抵消:
1000 0
2000 1
3000 2
左边的数字告诉程序什么时候必须以毫秒播放声音,右边的数字是声音ID。
因此,当我启动程序时,FMOD会生成一个波形文件,其中包含第一秒的kick(来自kick.wav),第二秒的命中,第三秒的长笛,我将必须等待至少3秒才能完成任务。
但是,如果我想渲染更长的音乐,比如5分钟,那么我必须等待至少5分钟才能完成任务,因为我依赖于系统计时器来播放声音文件中指定的偏移量和更新FMOD :: System的while(true)循环。我认为必须有一种方法可以更快地渲染而无需等待程序在指定的时间实际渲染声音,因为我在一个DAW程序中看到,比如索尼ACID,可以非常快速地渲染轨道。
然后我看一下API参考,有FMOD_OUTPUTTYPE_WAVWRITER_NRT,然后我认为这可能是解决方案,所以我尝试立即更改输出设备而不修改任何其他内容,生成的波形文件听起来搞砸了!我听到很多重复的声音,长时间的延迟等等。
那么,如何正确使用非实时版本?在我的情况下使用NRT时更新fmod系统的正确方法是什么?
我无法在fmod文档中找到关于NRT输出类型使用的明确解释。
无论如何,我在Windows环境中使用C ++。
感谢。
答案 0 :(得分:1)
FMOD_OUTPUTTYPE_WAVEWRITER_NRT的工作方式是每次调用System :: update时都会生成音频。每个'update'生成的数据量由System :: setDSPBufferSize的bufferlength参数控制。
因此,调用System :: update的速度越快,生成数据的速度就越快。现在,您工作的重要部分是将'x'调用System :: update转换为可以与时间轴匹配的内容。
默认情况下,FMOD的采样率为每秒48000个样本(可通过System :: setSoftwareFormat进行配置)。因此,如果将“bufferlength”设置为1024,则每次调用System :: update时都会生成1024个样本(写入wav文件)。所以... 1024/48000 = 0.021333秒〜每次调用生成21.3毫秒的数据。现在,您可以计算需要调用System :: update以获取时间戳的次数。