【发布时间】:2017-12-26 13:04:57
【问题描述】:
当文件的路径+文件名很长时,我注意到了
PlaySound(fName.c_str(), NULL, SND_ASYNC);
有效,但无效
mciSendString((L"open \"" + fName + L"\" type waveaudio alias sample").c_str(), NULL, 0, NULL);
mciSendString(L"play sample", NULL, 0, NULL);
失败命令示例:
open "C:\qisdjqldlkjsqdjqdqjslkdjqlksjlkdjqsldjlqjsdjqdksq\dajdjqjdlqjdlkjazejoizajoijoifjoifjdsfjsfszjfoijdsjfoijdsoifoidsjfoijdsofjdsoijfoisjfoijoisdjfosjfqsd\Windows Critical Stop.wav 类型波"
但是:
我真的需要 mciSendString 而不是 PlaySound(),因为 PlaySound() 不播放某些文件(48 khz 音频文件,有时是 24 位文件等)
我需要能够播放路径可能很长的音频文件,因为我的应用程序的最终用户可能有这样的文件
如何让 mciSendString 接受长文件名?
注意事项:
我也尝试过使用 mciSendCommand 的这个 MSDN 示例,但结果是一样的。
最大路径+文件名长度为127(127:工作,128+:不工作)
如果真的不可能让
mci*函数使用长于 127 字符的文件名,我可以使用什么来代替,只使用 winapi(没有外部库)? (PlaySound不是一个选项,因为它不能与所有 wav 文件一起工作,例如 48 khz:不工作等)
【问题讨论】:
-
试试 mciSendCommand()。
-
@JazzSoft 我刚试过,using this,很遗憾,它是一样的。
-
mciSendString返回的MCIERROR是什么?可能是MCIERR_FILENAME_REQUIRED- 文件名无效。确保文件名不超过 8 个 个字符,后跟句点和扩展名。关于open命令-这里必须是文件名吗?或设备名称? -
感谢@RbMm 提供此信息。 “不超过 8 个字符”看起来非常 pre-Windows95-ish!我可以确认它适用于
C:\Windows Critical Stop.wav,但不适用于C:\qisdjqldlkjsqdjqdqjslkdjqlksjlkdjqsldjlqjsdjqdksq\dajdjqjdlqjdlkjazejoizajoijoifjoifjdsfjsfszjfoijdsjfoijdsoifoidsjfojdsofjdsoijfoisjfoijoisdjfosjfqsd\Windows Critical Stop.wav -
MCI 是 Windows 多媒体的一部分,被微软视为“传统”。 msdn.microsoft.com/en-us/library/hh309469.aspx 所以这很可能是 API 的限制(在这种情况下,它永远不会被修复)
标签: c++ windows winapi audio mci