C#4.0 使用 winmm.dll 播放超过 192kbps 的.mp3文件时出现问题

本文关键字:文件 mp3 问题 192kbps 使用 winmm dll 播放 C#4 | 更新日期: 2023-09-27 18:30:39

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

**编辑:-温福应用

- 使用视窗 7 sp1

-使用Visulal Studio 2013社区版

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

C#4.0 使用 winmm.dll 播放超过 192kbps 的.mp3文件时出现问题

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

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

巧合的是,给我带来麻烦的 2 个文件有专辑封面,并完全填写了 ID3 数据(包括歌词)。所以我将根据我的需求切换到其他音频库

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

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

查看相关:

  • 无法在 IGraphBuilder.RenderFile 中播放 MP3 文件并出现 COM 异常
  • 播放mp3和wav文件收到错误:来自HRESULT的异常:在Windows 7上使用RenderFile(Strfilename)0x80040266
  • WM ASF 阅读器形式 MP3 音频播放

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