C#4.0使用winmm.dll播放超过192kbps的.mp3文件

时间:2014-11-17 23:23:05

标签: c# audio mp3 winmm

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,不确定那是什么

3 个答案:

答案 0 :(得分:6)

这不是Windows中的固有限制,这些问题是环境问题。基本检查清单:

  • 使用known-good MP3 file尝试此操作。该测试文件以320 kbps编码。这有助于消除文件的特​​定问题,例如只允许在经过批准的播放器上播放的难以理解的DRM方案。
  • 确保在STA线程上运行此代码,这是由Winforms或WPF应用程序提供的类型。 控制台模式应用,它需要您在this post中找到的代码类型。
  • 请注意安装了非标准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“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版本都存在这个问题。