【问题标题】:Error when reading audio file?读取音频文件时出错?
【发布时间】:2013-04-09 13:21:21
【问题描述】:

我尝试使用以下函数来确定 MP3 文件的长度:

public static string GetMP3DurationBackup(string Filename)
{
    string Duration = null;
    WMPLib.WindowsMediaPlayer w = new WMPLib.WindowsMediaPlayer();
    WMPLib.IWMPMedia m = w.newMedia(Filename);
    if (m != null)
    {
        Duration = m.durationString;
    }
    w.close();
    return Duration;
}

我遇到了以下错误:

检索具有 CLSID 的组件的 COM 类工厂 {6BF52A52-394A-11D3-B153-00C04F79FAA6} 由于以下原因而失败 错误:80040154..

当我从我的网络应用程序调用上述函数时(在下面调用):

string test = MediaUtil.GetMP3DurationBackup(@"C:\Temp\Audio\bad.mp3");

但是当我从我创建的控制台应用程序测试工具中调用它时(与上面的调用完全相同),它工作正常。我已在 Build 属性中将包含该函数的项目设置为以 x86 为目标,但这并没有解决问题。

有人知道为什么会这样吗?关于从哪里开始调试的建议?

为赏金更新:

好的,我已经尝试了很多方法,但仍然出现此错误。除其他外,我尝试了以下我认为最有希望的步骤,但没有骰子:

  1. 进入我的注册表并确认该值位于: HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{6BF52A52-394A-11d3-B153-00C04F79FAA6}\InprocServer32 指的是C:\WINDOWS\SysWOW64\wmp.dll
  2. 打开的命令提示符, 导航到 C:\WINDOWS\SysWow64,运行:regsvr32.exe wmp.dll

我创建了一个控制台应用程序测试工具,如果我在 x64 中运行测试项目,我能够重现该错误。如果我将它切换到 x86,它就可以正常工作。

有没有人知道为什么上述方法不能解决问题?关于下一步看哪里的建议?

【问题讨论】:

  • 您是否确保您的应用程序池将Enable 32-bit Applications 设置为True?
  • 这是运行 IIS 6 的 Windows Server 2003。这是 IIS 6 下的选项吗?
  • 为了子孙后代,我建议使用 Windows Server 2003/IIS 6.0 上的实际步骤: 步骤 1) 打开命令提示符并导航到 %systemdrive%\Inetpub\AdminScripts 目录。步骤 2) 键入以下命令:cscript.exe adsutil.vbs set W3SVC/AppPools/Enable32BitAppOnWin64 “true”
  • 注意位数(32 vs 64)不是由“包含函数的项目”决定的,而是由执行调用的windows进程决定的。为了确定调用期间的位数,您可以将 IntPtr.Size 的值转储到 C# 中的某个位置。如果是 8(64 位),则需要确保 wmd.dll 在注册表的 64 位端注册。如果是 4(32 位),需要确保 wmd.dll 在注册表的 32 位端注册。

标签: c# asp.net .net com


【解决方案1】:

您说它在 x64 中不起作用,但您尝试注册 32 位版本的 wmp.dll(C:\Windows\SysWow64 包含 32 位程序集)。

尝试注册x64版本的wmp.dll,在64位平台上位于C:\Windows\System32

如果您没有此文件,则可能没有适用于您的平台的 64 位 Windows Media Player。但是有一个解决方法:

创建一个 32 位控制台应用程序,它将 mp3 文件名作为命令行参数并使用 Console.WriteLine 将持续时间输出到标准输出,然后在 webapp 中调用控制台应用程序并捕获输出,如 this example on MSDN

【讨论】:

  • 我应该使用 SysWow64 或 System32 中的 regsvr32 吗?
  • 其实我刚查了一下,c:\windows\system32里面没有wmp.dll :(
  • 它存在于我的 Windows 7 机器上。也许您没有它,因为 Windows Server 2003 基于 XP。我很确定 DLL 不可互换。无论如何,我已经为我的答案添加了一个解决方法,应该可以在您的服务器上运行。
  • 好像有64位版本:see here
【解决方案2】:

试一试这个库。它速度快,对机器上安装的软件没有特殊要求。

http://naudio.codeplex.com/

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多