PlaySound() mmslib 不播放现有声音

Posted

技术标签:

【中文标题】PlaySound() mmslib 不播放现有声音【英文标题】:PlaySound() mmslib does not play existing sound 【发布时间】:2011-07-26 00:21:20 【问题描述】:

编辑:已解决。只是 .wav 文件不被 Windows 接受。我提取了一个 Windows 自己的文件并将其重命名为我以前的文件,它可以正常播放。

我不知道为什么这不能播放现有文件。 Windows 提示出现问题,但我不知道是什么。

我之前添加了一个检查以确保它存在。我也试过绝对路径。

string wavPath = "c:\\frog.wav";

struct stat stFileInfo;
bool blnReturn = (stat(wavPath.c_str(), &stFileInfo) == 0); //this returns true

FILE* fp = fopen(wavPath.c_str(), "r");
if (fp) 
   fclose(fp); //this triggers


PlaySound(wavPath.c_str(), NULL, SND_FILENAME | SND_ASYNC); //m_hinstance
//C:\\Users\\Wollan\\My Code\\A\\Debug\\frog.wav
//TEXT("frog.wav")
//TEXT(wavPath.c_str())
//(LPCSTR)"frog.wav¨

文件在 WMP 中可以正常播放。

【问题讨论】:

查看PlaySound的返回值。检查环境的错误状态。通过调试器运行代码。进行一些调试。 不要使用相对路径。使用绝对路径,确保将相同的路径传递给 stat() 和 PlaySound()。 当然也尝试过具有相同值的相对路径。 “C:\\frog.wav”。文件存在但无法播放,只有 Windows 错误提示音。 @Wollan:"C:\\Users\\Wollan\\My Code\\A\\Debug\\frog.wav" 还是 "C:\\frog.wav"?选择一个。 不起作用。文件存在检查是,但它没有播放。 【参考方案1】:

以下代码完美运行:

PlaySound(L"C:\\Windows\\Media\\Cityscape\\Windows Balloon.wav", 0, SND_FILENAME ); 

添加SND_ASYNC 播放失败。

【讨论】:

巴里克?仍然是 Windows 将其投射到(LPCSTR)。仅使用 L 我得到:-无法将参数 1 从 'const wchar_t [12]' 转换为 'LPCSTR'- 我现在要查看其他 wav 文件,似乎现在应该已经播放了。 Unicode 或 ANSI 字符串不是问题。只需传递文件名而不使用SND_ASYNC,看看它是否可以播放。 我第一次在那里做了,没用。无论如何,问题一直是一个坏文件(参见 OP)。【参考方案2】:

The documentation 说:

pszSound 参数是一个文件名。如果找不到文件, 该函数播放默认声音,除非 SND_NODEFAULT 标志为 设置。

还有:

PlaySound 在以下目录中搜索声音文件: 当前目录; Windows 目录;视窗系统 目录; PATH 环境变量中列出的目录;和 在网络中映射的目录列表。如果函数不能 找到指定的声音并且未指定 SND_NODEFAULT 标志, PlaySound 使用默认的系统事件声音。

没有为此结果指定其他情况。

因此,您听到提示音表示未找到文件,尽管您做出相反的保证。

我会仔细检查stat 调用的结果;我什至在文档中都找不到stat;它似乎不是 Windows 的一部分。

【讨论】:

【参考方案3】:

PlaySound(L"C:\Windows\Media\Cityscape\Windows Balloon.wav", 0, SND_FILENAME ); 添加 SND_ASYNC 无法播放。 这个答案是对的! 这是因为 ASYNC 模式在函数返回后播放音乐。 您的代码可能在音乐播放之前已经退出。 使用 int x, cin>>x,在 PlaySound 函数之后,你会发现效果很好。

【讨论】:

以上是关于PlaySound() mmslib 不播放现有声音的主要内容,如果未能解决你的问题,请参考以下文章

PlaySound的同步播放与异步播放

PlaySound的同步播放与异步播放

如何异步使用playsound?

PlaySound 无法播放两个异步声音

每当我使用“playsound”在后台播放声音时,我的游戏的其余部分都不会加载

C++ 中的 Playsound() 播放 windows 错误声音,我已经包含了 winmm.lib