【问题标题】:C#4.0 Issues playing .mp3 files over 192kbps using winmm.dllC#4.0 使用 winmm.dll 播放超过 192kbps 的 .mp3 文件时出现问题
【发布时间】:2015-01-15 00:33:48
【问题描述】:

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,不知道这是怎么回事

【问题讨论】:

  • Error number 对于 MCIERROR_INTERNAL 应该是 277。我在这里是因为同样的错误 277。也不要减去 256。这很愚蠢,因为请参阅链接。

标签: c# audio mp3 winmm


【解决方案1】:

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

【讨论】:

  • 谢谢!我会注意到我正在使用 Visual C# 2013 社区,这是一个 windows7 sp1 操作系统,我正在制作一个 winform 应用程序。我会听从您的建议,看看当文件无法播放时我会收到什么样的错误报告。 21 小时后,当我被允许发放赏金时,你会得到赏金。谢谢!
  • 已知良好的 MP3 文件为我解决了这个问题。我的第一个测试 mp3 有一个知识共享许可证。愚蠢的世界-.-
【解决方案2】:

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

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

【讨论】:

  • 如果您通过 Hans 的回答解决了这个问题,您应该将他的回答标记为已接受。尤其是因为你悬赏了它。
  • 很公平,无论如何我都打算把赏金给他。
【解决方案3】:

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

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

查看相关:

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

【讨论】:

  • 您没有回答问题,我不知道 DirectShow 是什么,但我使用 Winmm.dll 进行音频播放。这对我没有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多