我正在尝试对FMOD库中的Sound.readData和Sound.lock之间的差异进行排序(我使用C#/ C++进行编程,但是我会用任何语言来回答!)。最终目标是创建波形 View ,据我了解,使用Channel.getWaveData无法(轻松地)完成该操作。

我已经能够使用Sound.readData和Sound.lock方法分别使用createStream和createSound返回相同的数据(不确定其是否有效,例如,解码数据)。如果可能的话,我想使用流方法来最大程度地减少内存占用,但是我不确定我现在正在阅读的内容是什么,并且文档也不是很清楚。

最佳答案

本质上,两者之间的区别在于您要访问的内容。

使用Sound::lock可以锁定声音的样本缓冲区,因此在使用createSound加载时,它将文件解压缩为PCM并将其放入样本缓冲区中。您可以使用此功能直接访问该缓冲区(锁定所需的部分)。如果您在控制台上,则数据可能是本机压缩格式。附带说明一下,“锁定”声音的想法来自DirectSound API,您可以在其中读取或写入缓冲区时“锁定”缓冲区以防止对其进行访问,完成后,您可以解锁给定的访问权限音频系统。

Sound::readData是从声音中提取(流式)PCM数据的一种更为渐进的方法,在这里,您实际上是在每次readData调用时将压缩数据解码为PCM。您可以在较小的块中执行此操作,并且始终可以获得最终解码的PCM数据。这种方法更灵活,存储效率更高。

例如,您可以加载10MB MP3作为流,然后使用Sound::readData块将其解码为PCM。否则,您将需要将其作为样本加载(在createSound时将其解码为PCM),然后锁定大量缓冲区以获取PCM。

getWaveData用于在当前播放时显示波形,不应用于解码文件的完整波形。根据对getWaveData的调用频率,您可能会多次获得同一数据块,因为它在时间上是单个快照。

关于c# - Sound.readData和Sound.lock之间的FMOD有何区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3732504/

10-12 05:47