MCIERR_INTERNALI我正在尝试在应用程序中制作一个简单的媒体播放器,但我注意到我的代码不会播放音乐,除非该文件的比特率低于192kbps或更低。问题是我的大部分音乐都在260-320kbps左右。
这是我的代码,如果有什么我可以做的'可用'比特率选项让我知道,否则我需要一个新的DLL建议!
class MusicPlayer
{
[DllImport("winmm.dll")]
private static extern long mciSendString(string lpstrCommand, StringBuilder lpstrReturnString, int uReturnLength, int hwndCallback);
private static void checkMCIResult(long code)
{
int err = (int)(code & 0xffffffff);
if (err != 0)
{
throw new Exception(string.Format("MCI error {0}", err));
}
}
public void open(string file)
{
string command = "open \"" + file + "\" type MPEGVideo alias MyMp3";
checkMCIResult(mciSendString(command, null, 0, 0));
}
public void play()
{
string command = "play MyMp3";
mciSendString(command, null, 0, 0);
}
public void pause()
{
string command = "stop MyMp3";
mciSendString(command, null, 0, 0);
}
}
**编辑: - 申请申请
- 使用Windows 7 sp1
- 使用Visulal Studio 2013社区版
- 从错误捕获我现在看到错误号是289,-256 = 22:MCIERR_INTERNAL,不确定那是什么
答案 0 :(得分:6)
这不是Windows中的固有限制,这些问题是环境问题。基本检查清单:
错误检查器方法的简单实现:
private static void checkMCIResult(long code) {
int err = (int)(code & 0xffffffff);
if (err != 0) {
throw new Exception(string.Format("MCI error {0}", err));
}
}
用法:
public static void open(string file) {
string command = "open \"" + file + "\" type MPEGVideo alias MyMp3";
checkMCIResult(mciSendString(command, null, 0, 0));
}
有很多可能的MCI错误,你会发现它们列在你机器上Windows SDK“include”目录的MMSystem.h文件中。像C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.1A \ Include \ MMSystem.h。从MCIERR_INVALID_DEVICE_ID开始,从错误代码中减去256。总是提到您的Windows和VS版本顺便说一句。
答案 1 :(得分:0)
好的,所以我想出来了(感谢@Hans Passant),我收到的错误代码是277,原来有MCI和mp3的问题有一个大的ID3(v2.x)标签 - 专辑艺术,歌词等。
巧合的是,导致我麻烦的2个文件有专辑封面,并且完全填写了ID3数据(包括歌词)。所以我将根据我的需要切换到其他音频库
答案 2 :(得分:0)
Windows API播放或不播放特定MP3文件的典型问题如下。其中一个标准的MP3读取/解析组件有一个[推测?,我的印象是16KB有问题]固定大小的缓冲区最初要读取,然后跳过标签并进入真正的比特流。使用大量标记时,解析器无法读取数据并拒绝将文件视为不可播放。
当通过DirectShow播放时(对于C#代码,这通常是通过DirectShow.NET开源库播放),建议使用另一个能够读取MP3文件的Windows组件,这些文件没有标签问题:Windows Media ASF Reader过滤器。
见相关:
尽管这是一个长期存在的问题,但微软多年前决定不更新标准的MPEG-1流分割器,而且所有Windows版本都存在这个问题。