这是我先前问题的后续: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.wav)在第一秒,一个命中在第二个,一个长笛在第三秒,我将必须等待至少3秒的任务才能完成。
但是,如果我想呈现一个更长的音乐,比如5分钟,那么我必须等待至少5分钟才能完成任务,因为我让它依赖于系统定时器来播放文件中指定偏移量处的声音,并使用then (True)循环来更新FMOD::System。我认为一定有一种方法可以更快地渲染,而不需要等待程序在指定的时间真正渲染声音,因为我在一个DAW程序中看到,比如,索尼ACID,可以很快地渲染音轨。
然后我稍微看一下API引用,有FMOD_OUTPUTTYPE_WAVWRITER_NRT,然后我想这可能是解决方案,所以我尝试立即更改输出设备而不修改其他任何东西,生成的wave文件听起来很混乱!我听到许多重复的声音,长时间的延迟等。
那么,如何正确地使用非实时版本呢?在我的例子中使用NRT时,更新fmod系统的正确方法是什么?
我无法清楚地解释fmod文档本身中NRT输出类型的使用情况。
无论如何,我在Windows环境中使用C++。
谢谢。
发布于 2012-02-02 03:54:51
FMOD_OUTPUTTYPE_WAVEWRITER_NRT的工作方式是每次调用系统::update时都生成音频。每个“update”生成的数据量由System::setDSPBufferSize的缓冲区长度参数控制。
因此,您调用系统::更新的速度越快,生成的数据就越快。现在,您的工作的重要部分是将x的调用数转换到System::update,您可以将其与时间线相匹配。
默认情况下,FMOD以每秒48000个样本的速度工作(可通过System::setSoftwareFormat配置)。因此,如果将“缓冲区长度”设置为1024,则每次调用System::update 1024时都会生成示例(写入wav文件)。所以..。1024 / 48000 = 0.021333秒~ 21.3毫秒的数据是每次调用生成的。现在,您可以计算需要调用System::update以获得所拥有的时间戳的次数。
https://stackoverflow.com/questions/9082583
复制相似问题