首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fmod:如何使用FMOD_OUTPUTTYPE_WAVWRITER_NRT?

fmod:如何使用FMOD_OUTPUTTYPE_WAVWRITER_NRT?
EN

Stack Overflow用户
提问于 2012-01-31 15:55:36
回答 1查看 1.1K关注 0票数 1

这是我先前问题的后续:Rendering some sound data into one new sound data?

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

所以我认为FMOD_OUTPUTTYPE_WAVWRITER很适合这份工作。

对于健全的银行,可以在文件中想象这样的事情:

代码语言:javascript
复制
0 kick.wav
1 hit.wav
2 flute.wav

其中左边的数字描述右侧声音文件名的声音ID,以及时间偏移:

代码语言:javascript
复制
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++。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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以获得所拥有的时间戳的次数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9082583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档