4

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);
    }
}

**编辑:-Winform 应用程序

- 使用 Windows 7 sp1

- 使用 Visual Studio 2013 社区版

-从错误捕获我现在看到错误号是 289,-256 = 22: MCIERR_INTERNAL,不知道这是怎么回事

4

3 回答 3

6

这不是 Windows 的固有限制,此类问题是环境问题。一个基本的清单:

  • 已知良好的 MP3 文件试试这个。该测试文件以 320 kbps 编码。这有助于消除文件的特​​定问题,例如仅允许在经过批准的播放器上播放的不稳定 DRM 方案。
  • 确保在 STA 线程上运行此代码,这种线程由 Winforms 或 WPF 应用程序提供。 不是控制台模式应用程序,它需要您在这篇文章中找到的那种代码。
  • 小心安装了非标准的 ACM 驱动程序。那里有很多垃圾,总是以强烈的不信任对待“编解码器包”。查看 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32 注册表项,这是注册 ACM 驱动程序的位置。
  • 最后但同样重要的是,只要您忽略 mciSendString() 的返回值,您就会像蝙蝠一样盲目。当它失败时,它会产生一个错误代码,告诉您原因。

错误检查器方法的简单实现:

    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“包含”目录中的 MMSystem.h 文件中。像 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\MMSystem.h。从 MCIERR_INVALID_DEVICE_ID 开始,从错误代码中减去 256。顺便提一下你的 Windows 和 VS 版本。

于 2014-11-20T18:35:37.127 回答
1

好的,所以我想通了(感谢@Hans Passant),我收到的错误代码是 277,结果发现 MCI 和 mp3 存在问题,它们有一个大的 ID3(v2.x)标签 - 专辑封面、歌词等.

巧合的是,引起我麻烦的2个文件有专辑封面,并且完全填写了ID3数据(包括歌词)。因此,我将根据需要切换到其他音频库

于 2014-11-20T19:19:52.660 回答
0

Windows API 播放或不播放特定 MP3 文件的典型问题如下。标准 MP3 读取/解析组件之一有一个 [大概?,我印象中 16KB 有问题] 固定大小的缓冲区,用于最初读取,然后跳过标签并获取真正的比特流。有很多标签,解析器无法读取数据并拒绝文件为不可播放。

当通过 DirectShow 播放时(对于 C# 代码,这通常是通过 DirectShow.NET 开源库播放),建议使用另一个能够读取 MP3 文件的 Windows 组件,它没有标签问题:Windows Media ASF Reader filter .

见相关:

尽管这是一个长期存在的问题,但微软多年前决定不更新标准的 MPEG-1 分流器,并且该问题基本上存在于所有 Windows 版本中。

于 2014-11-20T19:27:26.467 回答