1

这是我之前的问题的后续:将一些声音数据渲染成一个新的声音数据?

我正在创建一个程序,该程序将处理包含声音库和时间偏移的文件,以标记何时必须播放声音并从中生成波形文件。

所以我想 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 分钟才能完成任务,因为我让它依赖于系统计时器以指定偏移量播放声音在文件中和一个 while(true) 循环来更新 FMOD::System. 我认为必须有一种方法可以更快地渲染,而无需等待程序在指定时间实际渲染声音,因为我在 DAW 程序中看到,比如 Sony ACID,可以非常快速地渲染音轨。

然后我看了一下API参考,有FMOD_OUTPUTTYPE_WAVWRITER_NRT,然后我想这可能是解决方案,所以我尝试立即更改输出设备而不修改其他任何内容,生成的波形文件听起来很乱!我听到许多重复的声音、长时间的延迟等。

那么,如何正确使用非实时版本呢?在我的情况下使用 NRT 时更新 fmod 系统的正确方法是什么?

我在 fmod 文档本身中找不到关于 NRT 输出类型使用的明确解释。

无论如何,我在 Windows 环境中使用 C++。

谢谢。

4

1 回答 1

1

FMOD_OUTPUTTYPE_WAVEWRITER_NRT 的工作方式是每次调用 System::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 多少次才能获得您拥有的时间戳。

于 2012-02-02T03:54:51.540 回答