将 wavs 加载到内存中,然后使用 Win32 API 异步播放声音

Posted

技术标签:

【中文标题】将 wavs 加载到内存中,然后使用 Win32 API 异步播放声音【英文标题】:Load wavs into memory then play sounds asynchronously using Win32 API 【发布时间】:2015-08-31 22:22:25 【问题描述】:

我正在使用 C++ 和 Win32 API 编写一个简单的游戏。我想在初始化阶段(游戏开始之前)将一些音效加载到内存中。然后我希望能够在游戏过程中异步触发这些声音。

我研究了一些推荐 mmlib 的帖子,(PlaySound),这可行,但示例似乎每次都从文件中加载,如下所示:

PlaySound("rocket_launch.wav", NULL, SND_FILENAME | SND_ASYNC);

我想在开始时将我的声音加载到内存中,然后随时播放。希望我不需要使用资源文件。

我该怎么做?

【问题讨论】:

【参考方案1】:

PlaySounddocs 表示传入SND_MEMORY 表示第一个参数指向内存缓冲区。

首先,将文件加载到内存中,然后传入指向缓冲区的指针,并将SND_FILENAME 标志换成SND_MEMORY 标志。

【讨论】:

谢谢,我看了一下。它描述了从资源加载,如果可能的话,我宁愿不这样做!我在想也许有一种更简单的方法来加载一个 wav,然后播放它? @SimonBosley SND_RESOURCE 来自资源,SND_MEMORY 来自内存。 @SimonBosley 您不需要作为资源加载...here is a code sample 从普通文件加载 wav 并从内存缓冲区播放。 @JonathanPotter 我发现使用 SND_MEMORY 的示例首先已经从资源 (LoadResource) 加载了文件,这是我试图避免的。 @Buddy 我最初被一些 cmets 推迟到那个页面上,他们说文件没有按预期播放。看起来是我需要的,我会试一试,看看结果如何!【参考方案2】:

致任何寻找简单示例的人:

std::string sound = "RIFFªÛ\x5....."; //(Binary of a .wav file)
PlaySoundA(sound.c_str(), NULL, SND_MEMORY | SND_SYNC); //Extracting the binary to a c-style string & playing

【讨论】:

以上是关于将 wavs 加载到内存中,然后使用 Win32 API 异步播放声音的主要内容,如果未能解决你的问题,请参考以下文章

在python中使用win32在内存中创建一个图标

尝试使用 Win32 WASAPI C++ 中的“捕获流”创建 wav 文件

Win32 API 多线程播放 .wav 文件没有延迟

如何使用 NAudio 将声音文件加载到内存中并稍后使用?

加载和保存 WAV 文件

动态加载并执行Win32可执行程序