我正在尝试在FMOD库中对Sound.readData和Sound.lock之间的区别进行分类(我是用C#/C++编程的,但我会接受任何语言的答案!)。最终目标是创建一个波形视图,我知道这不能(很容易)用Channel.getWaveData完成。
我已经能够让Sound.readData和Sound.lock方法分别用createStream和createSound返回相同的数据(还不确定它是否是有效的-例如解码的-数据)。如果可能的话,我想使用流方法来最小化内存占用,但是我不确定我现在正在阅读的是什么,并且文档也不是完全清楚。
发布于 2010-09-20 08:32:09
从本质上讲,两者之间的区别在于您访问的是什么。
使用Sound::lock将锁定声音的采样缓冲区,因此当您使用createSound加载时,它会将文件解压缩到PCM并将其放入采样缓冲区中。您可以使用此函数直接访问该缓冲区(锁定所需的部分)。如果您在控制台上,则数据可能是本机压缩格式。作为旁注,“锁定”声音的想法来自于DirectSound应用程序接口,在那里你将“锁定”一个缓冲区,以防止在你从它读取或写入它时访问它,当你完成后,你解锁了,因为你可以访问回音频系统。
readData是一种从声音中提取(流式) PCM数据的更渐进的方法,在这里,您实际上是在使用每个readData调用将压缩数据解码为PCM。您可以在较小的块中执行此操作,并始终获得最终解码的PCM数据。这种方法更加灵活,内存效率也更高。
例如,您可以加载一个10MB的MP3作为流,然后使用Sound::readData以块的形式将其解码为PCM。否则,您将需要将其作为样本加载(在createSound时间将其解码为PCM ),然后锁定一个大容量的缓冲区以获取PCM。
getWaveData用于显示当前播放时的波形,不能用于解码文件的完整波形。根据对getWaveData的调用频率,您可能会多次获得相同的数据块,因为它是时间上的单个快照。
发布于 2010-09-19 12:00:14
经过更多的研究,我相当确定两者之间没有显着差异。我可能最终会使用readData,因为它看起来更容易,更灵活。此外,lock对于这个方法来说是一个令人困惑的名称:)。
https://stackoverflow.com/questions/3732504
复制相似问题