【问题标题】:How do I make PlaySound load only some parts of the song C++ [closed]如何让 PlaySound 仅加载歌曲 C++ 的某些部分 [关闭]
【发布时间】:2020-11-27 12:09:57
【问题描述】:

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

【问题讨论】:

  • 您已经列出了设计为在 MS Windows 平台上运行的功能签名,但正在谈论 DOS。这些看似矛盾。您是在谈论实际的预 Windows DOS,还是来自 MS Windows 内部的命令提示符窗口? (PlaySound 在 DOS 下不可用)
  • @enhzflep 我怀疑 DOS 格式程序是指 Win32 控制台应用程序。这是使用 PlaySound 有意义的唯一上下文。
  • 你不能那样做。如果您解释了什么是“dos 格式程序”,那么有人可能会帮助您找出其他方法。
  • @ComicSansMS - 我也是,原因与您提到的相同。我提出这个问题的部分理由是探讨这是一个 XY 问题的可能性。这些天来,运行 Windows 在任何有意义的意义上都没有出现 500 兆内存的问题。没有正当理由做一大堆记忆保存工作是一种耻辱。也就是说,维护几个缓冲区并简单地用几个备用填充一个缓冲区以吸收磁盘延迟并不是很困难。没有任何音频人工制品是很容易实现的。

标签: c++ ram playsound


【解决方案1】:

PlaySound 是一个相当高级的函数,因此很难获得这样的行为。特别是,您可能会在播放不同部分之间遇到小的无声间隙。因此,最好的解决方案是使用允许更复杂地管理声音播放缓冲区的较低级别的 API。 OpenAL 是一个很好的库,现代的 Windows 原生解决方案是 WASAPI,不幸的是使用起来相当复杂。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 2013-04-06
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多