如何让 PlaySound 仅加载歌曲 C++ 的某些部分

How do I make PlaySound load only some parts of the song C++

我有一个 424 MB 的 wav 文件,我想播放它,但加载它需要很多时间,而且它使用 425.6 MB 的内存。对于 dos 格式程序来说,ram 太多了。我只想加载歌曲的一部分,然后当它快到最后时,加载第二部分,当播放第二部分时,从 ram 中删除第一部分,等等。为此我应该使用 50 个部分。 这是代码行: PlaySound("../music/main.wav", NULL, SND_FILENAME|SND_LOOP|SND_ASYNC); 我提到我需要 运行 在后台执行此操作,而其他命令执行其任务。

PlaySound 是一个相当 high-level 的函数,因此很难获得这样的行为。特别是,您可能会在播放不同部分之间遇到微小的无声间隙。因此,最好的解决方案是使用 lower-level API,它允许对声音播放缓冲区进行更复杂的管理。 OpenAL is a good library for doing this, the modern Windows native solution is WASAPI,遗憾的是使用起来相当复杂。

对于 PlaySound 本身,首先调整您的程序以将 .wav 文件加载到内存中,然后使用 SND_MEMORY 从内存中播放它 (example)。

现在,您无需一次加载整个 .wav 文件,只需加载 header 和尽可能多的声帧来填充您的缓冲区。然后,您只为那些加载的样本创建自己的 .wav header 并将其全部放在连续的缓冲区中。您基本上是在内存中构建自己的较小 .wav 文件。然后你在那个缓冲区上调用 PlaySound(..., SND_MEMORY) 。冲洗并重复原始文件中的剩余样本。

请注意,为此您需要自己的 .wav 文件格式解析器,但文件格式并没有那么复杂,所以希望这不会成为太大的问题。