当文件的路径文件名很长时,我注意到了
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);
失败命令的示例:
打开“C:\ qisdjqldlkjsqdjqdqjslkdjqlksjlkdjqsldjlqjsdjqdksq \ dajdjqjdlqjdlkjazejoizajoijoifjoifjdsfjsfszjfoijdsjfoijdsoifoidsjfojdsofjdsoijfoisjfoijoisdjfosjfqsd \ Windows Critical Stop.wav”type waveaudio alias sample
但:
-
我真的需要mciSendString而不是PlaySound(),因为PlaySound()不播放某些文件(48 khz音频文件,有时是24位文件等)
-
我需要能够播放具有可能长路径的音频文件,因为我的应用的最终用户可能有这样的文件
How to make mciSendString accept long filenames?
笔记:
-
我也尝试使用mciSendCommand这个MSDN示例,但它是一样的 .
-
最大路径文件名长度为127(127:工作,128:不工作)
-
如果真的不可能使
mci*
函数使用长于127个字符的文件名,我可以使用什么代替,只需使用winapi(没有外部库)? (PlaySound
不是一个选项,因为不能与所有wav文件一起使用,例如48 khz:non-working等)
4 回答
127限制看起来很奇怪 . 我没有在MSDN上找到任何关于它的信息 .
有一种替代语法可供打开:open waveaudio!right.wav
您可以尝试的选项是将工作目录更改为文件目录,然后限制仅适用于文件名 . - > SetCurrentDiectory
要缩短文件名,可以使用Winapi函数GetShortPathName
但:
基于MSDN的示例:
这是传统MCI功能的限制 . 使用MCI API时会遇到两个问题:
路径名是too long,此API无法处理长文件名 . 限制通常在
260
字符左右,如页面上所述 .并非所有文件都有"short name" . Starting with Windows 7,可以禁用所谓的
8.3
(FILENAME.EXT
)文件创建 . 这意味着可能没有GetShortPathName
可以返回的路径允许MCI访问该文件 .强烈建议使用现代API替换整个内容 . 如其他评论者所述,
DirectDraw
和Media Foundation
将是合适的替代品 .我调试了它(在
mciSendCommand
示例中) . 当mwOpenDevice
调用mmioOpen时会发生此问题:这里,使用
MMIO_PARSE
flag调用mmioOpen将文件路径转换为完全限定的文件路径 . 根据MSDN,这有一个限制:也就是说,缓冲区总是假定为128字节长 . 对于长文件名,缓冲区结果不足并且mmioOpen返回错误,导致
mciSendCommand
认为声音文件丢失并返回MCIERR_FILENAME_REQUIRED
.不幸的是,由于它正在解析完全限定的文件路径,
SetCurrentDirectory
无济于事 .由于问题出在MCI驱动程序(
mciwave.dll
)内,我怀疑是否有办法强制MCI子系统处理长路径 .鉴于你的限制(不能改变任何API),这是一个MCI的事情,我会考虑将当前请求的文件复制到
temp
并在那里播放,以防你的第一次尝试失败:您可以在
result
上使用mciGetErrorString来查找您正在获取的确切错误代码 - 并使if
具体,也许以不同的方式处理其他错误..我看了the list of errors但我不确定 .如果您创建了新文件,请不要忘记使用Windows API中的
DeleteFile
. 我不知道你是想在节目结束之前还是在比赛结束后立即保留它,所以决定什么更有意义 .您还想检查
CopyFile
的成功,以防出现其他问题 . 你真的需要在这里检查自己 .